Android에서 어떤 아키텍처 패턴이 사용됩니까? [닫은]


268

모바일 플랫폼에 대한 작은 연구를하고 있는데 Android에서 어떤 디자인 패턴이 사용되는지 알고 싶습니다.

예를 들어 iOS에서 모델 뷰 컨트롤러는 위임 및 기타 패턴과 함께 매우 널리 사용됩니다.

Android는 어떤 패턴과 특히 사용합니까?

편집하다

커널, dalvik 등에서 깊이 사용 된 디자인 패턴을 요구하는 것이 아니라 응용 프로그램을 개발하는 동안 응용 프로그램 개발자가 만나는 패턴에 대해 묻습니다.


2
안드로이드 플랫폼에 리눅스 커널이 포함되어 있기 때문에 '지금까지 명명 된 모든 패턴, 그리고 충분히 신중하게 살펴보면 몇 가지 새로운 패턴'외에이 질문에 대답하기에는 너무 큰 소프트웨어 스위트입니다.
Pete Kirkham

5
@Pete가, 좋아, 아마 당신이 바로,하지만 동시에 나는 깊은 커널 정도로 않을거야있다, 내가 예를 들어 아이폰 OS에서 응용 프로그램의 표면에 관심이 UIViewControllerMVC를 사용하여 구현 ( UIViewController컨트롤러이고 그것의 뿌리 UIView이다) , UIApplication응용 프로그램 위임을 위임으로 위임을 사용합니다.
Burjua

4
나는 당신이 정말로 안드로이드를 아래에서 위로 배우고 iOS에서 안드로이드로 당신의 지식을 "이식"하려고해서는 안된다고 생각합니다. 훌륭한 책들이 많이 있습니다. Apress는 무리를 만듭니다. 안드로이드의 앱 및 서비스 수명주기를 이해하면 앱을 올바르게 삭제하는 방법을 얻을 수 있어야합니다.
blindstuff


이것은 도움이 될 수 있습니다 : stackoverflow.com/a/49694378
Ali Nem

답변:


324

안드로이드 개발을 위해 MVC ( model-view-controller )와 model-view-presenter 아키텍처 패턴을 모두 사용해 보았습니다 . 내 연구 결과는 모델 뷰 컨트롤러가 잘 작동하지만 몇 가지 "문제"가 있습니다. 그것은 모두 당신이 안드로이드 Activity클래스 를 어떻게 인식하는지에 달려 있습니다 . 컨트롤러입니까 아니면보기입니까?

실제 Activity클래스는 Android View클래스를 확장하지 않지만 사용자에게 창 표시를 처리하고 해당 창의 이벤트 (onCreate, onPause 등)도 처리합니다.

즉, MVC 패턴을 사용하는 경우 컨트롤러는 실제로 의사보기 컨트롤러가됩니다. 사용자에게 창 표시를 처리하고 추가 뷰 구성 요소를 사용하여 setContentView를 사용하여 창에 추가했으며 최소한 다양한 활동 수명주기 이벤트에 대한 이벤트도 처리합니다.

MVC에서 컨트롤러는 주요 진입 점으로 간주됩니다. 활동이 대부분의 응용 프로그램의 자연스러운 진입 점이기 때문에 Android 개발에 적용 할 경우 약간 논쟁의 여지가 있습니다.

이로 인해 개인적으로 모델 뷰 프리젠터 패턴이 Android 개발에 완벽하게 맞는다는 것을 알게 되었습니다. 이 패턴에서 뷰의 역할은 다음과 같습니다.

  • 진입 점으로 사용
  • 렌더링 컴포넌트
  • 발표자에게 사용자 이벤트 라우팅

이를 통해 다음과 같이 모델을 구현할 수 있습니다.

보기 -UI 구성 요소가 포함되어 있으며 해당 구성 요소의 이벤트를 처리합니다.

발표자 -모델과 뷰 간의 통신을 처리하고 모델의 게이트웨이로 간주합니다. 즉, 복잡한 도메인 모델을 나타내는 경우 하나님은 무엇을 알고 있으며 뷰에이 모델의 매우 작은 서브 세트 만 있으면됩니다. 발표자는 모델을 쿼리 한 다음 뷰를 업데이트해야합니다. 예를 들어 텍스트 단락, 헤드 라인 및 단어 수를 포함하는 모델이있는 경우입니다. 그러나 특정보기에서는보기에 헤드 라인 만 표시하면됩니다. 그런 다음 발표자는 모델에서 필요한 데이터를 읽고 그에 따라보기를 업데이트합니다.

모델 -기본적으로 전체 도메인 모델이어야합니다. 위와 같이 사례를 처리하기위한 특별한 방법이 필요하지 않기 때문에 도메인 모델을보다 "단단하게"만드는 데 도움이되기를 바랍니다.

프리젠터를 사용하여 뷰에서 모델을 모두 분리함으로써 모델을 테스트하는 것이 훨씬 직관적이됩니다. 도메인 모델에 대한 단위 테스트와 발표자에 대한 단위 테스트를 가질 수 있습니다.

사용해보십시오. 개인적으로 안드로이드 개발에 적합하다고 생각합니다.


14
좋은 답변입니다! 나는 질문이있다 : 1. 활동 = 전망, 나는 이것을 올바르게 얻었 는가? 2. 발표자를 자체 공개 클래스 또는 활동의 내부 클래스로 구현 하시겠습니까? 아니면 조각 (내부 클래스)? 3. 액티비티 (뷰)에서 실제 모델 클래스 대신 전송 클래스를 사용해야 함을 의미합니까?
manmal

14
1. 예, MVP 패턴 내에서 뷰로 사용합니다. 2. 개인적으로, 나는 그것들을 개별 공개 수업으로 나눕니다. 그러나 이것은 내가 생각하는 맛의 문제입니다. :) 3. 나는 이것을 상당히 나쁘게 설명했다. 내 말은, 발표자는 뷰와 모델 사이에 앉아 모델을 읽은 다음 뷰를 업데이트한다는 것입니다. 좀 더 명확하게 답변을 업데이트하겠습니다. :)
JustDanyul

시간 내 주셔서 감사합니다, 나는 지금 그것을 얻을 :)
manmal

11
나는 실제로 안드로이드 개발이 매우 분리되어 있기 때문에 정말 좋아합니다. MVC 사용 방법 : 사용자 IO에만 활동을 사용하고 모든 처리에 로컬 서비스를 사용하십시오. 서비스가 무언가를 보여주고 싶을 때-활동에 방송하십시오! 다른 개발자가 활동을 너무 많이 처리하면 정말 싫어합니다.
누군가 어딘가에

8
@SomeoneSomewhere 별도의 스레드 / AsyncTasks 에서이 물건을 처리하는 클래스가없는 이유는 무엇입니까?
소년

87

2018 년 11 월 업데이트

몇 년 동안 Android에서 MVC 및 MVP에 대한 작업 및 블로그 작업을 한 후 (아래 답변 본문 참조) 더 포괄적이고 쉽게 소화 할 수있는 형태로 내 지식과 이해를 포착하기로 결정했습니다.

그래서 나는 안드로이드 애플리케이션 아키텍처에 대한 완전한 비디오 코스를 발표했다. 따라서 Android 개발에서 가장 고급 아키텍처 패턴을 익히려면 여기에서이 포괄적 인 과정을 확인하십시오 .

이 답변은 2016 년 11 월부터 관련성을 유지하기 위해 업데이트되었습니다.


디자인 패턴 보다는 건축 패턴을 찾는 것 같습니다 .

디자인 패턴 은 프로그래머가 특정 반복적 인 소프트웨어 작업을 처리하기 위해 구현할 수있는 일반적인 "트릭"을 설명하는 것을 목표로합니다. 예를 들면 : OOP에서, 객체가 일부 이벤트에 대해 다른 객체 세트에 통지 할 필요가있을 때, 관찰자 디자인 패턴 이 사용될 수있다.

안드로이드 응용 프로그램 (및 대부분의 AOSP)은 객체 지향적 인 Java로 작성되었으므로 Android에서 사용되지 않는 단일 OOP 디자인 패턴을 찾는 데 어려움을 겪을 것이라고 생각합니다.

반면에 아키텍처 패턴 은 특정 소프트웨어 작업을 다루지 않으며 문제의 소프트웨어 구성 요소 사용 사례를 기반으로 소프트웨어 구성 을위한 템플릿 을 제공하는 것을 목표로합니다 .

약간 복잡한 것처럼 들리지만 예제가 명확 해지기를 바랍니다. 일부 응용 프로그램을 사용하여 원격 서버에서 데이터를 가져 와서 구조화 된 방식으로 사용자에게 제시하면 MVC 가 고려하기에 좋습니다. 응용 프로그램의 소프트웨어 작업 및 프로그램 흐름에 대해서는 아무 말도하지 않았습니다. 방금 사용자 관점에서 설명했지만 아키텍처 패턴의 후보가 나타났습니다.

귀하의 질문에 MVC를 언급 했으므로 건축 패턴이 당신이 찾고있는 것이라고 생각합니다.

여기에 이미지 설명을 입력하십시오


역사적으로 Google은 애플리케이션 아키텍처에 대한 공식 가이드 라인을 제공하지 않았으며, 그 이유는 무엇보다도 Android 앱의 소스 코드에 큰 혼란을 초래했습니다. 실제로 오늘날까지도 볼 수있는 대부분의 응용 프로그램은 여전히 ​​OOP 모범 사례를 따르지 않으며 명확한 논리적 코드 구성을 보여주지 않습니다.

그러나 오늘날 상황은 다르다. 구글은 최근 안드로이드 스튜디오와 완벽하게 통합 된 데이터 바인딩 라이브러리를 출시했으며 심지어 안드로이드 애플리케이션을위한 일련의 아키텍처 청사진을 발표했다 .

2 년 전에는 Android에서 MVC 또는 MVP에 대한 정보를 찾기가 매우 어려웠습니다. 오늘날 MVC, MVP 및 MVVM은 Android 커뮤니티에서 "버즈 워드"가되었으며 MVx가 MVy보다 낫다는 것을 지속적으로 확신시키는 수많은 전문가들로 둘러싸여 있습니다. 내 의견으로는 MVx가 MVy보다 나은지에 대한 논의는 용어 자체가 매우 모호하기 때문에 전혀 의미가 없습니다. 이 질문에 대한 답변을 살펴보십시오. 다른 사람들 이이 약어를 완전히 다른 구성과 연관시킬 수 있음을 알게 될 것입니다.

안드로이드에 가장 적합한 아키텍처 패턴에 대한 검색이 공식적으로 시작 되었기 때문에 몇 가지 아이디어가 더 나올 것이라고 생각합니다. 이 시점에서 미래에 어떤 패턴이 산업 표준이 될지 예측하는 것은 실제로 불가능합니다. 우리는 기다려야 할 것입니다 (1 ~ 2 년 문제라고 생각합니다).

그러나 높은 신뢰도로 만들 수있는 한 가지 예측이 있습니다. 데이터 바인딩 라이브러리의 사용은 업계 표준이되지 않습니다. Data Binding 라이브러리 (현재 구현)는 단기적인 생산성 향상과 일종의 아키텍처 지침을 제공하지만 장기적으로는 코드를 유지 관리 할 수 ​​없다고 확신합니다. 이 라이브러리의 장기적인 효과가 드러나면 포기됩니다.


현재 공식적인 지침과 도구가 있지만, 개인적으로 이러한 지침과 도구가 최선의 선택이라고 생각하지는 않습니다 (그리고 반드시 유일한 것은 아닙니다). 내 응용 프로그램에서는 MVC 아키텍처의 자체 구현을 사용합니다. 간단하고 깨끗하며 읽기 쉽고 테스트 가능하며 추가 라이브러리가 필요하지 않습니다.

이 MVC는 다른 것들과 외형 적으로 다를뿐 아니라 Android의 활동이 UI 요소가 아니라는 이론을 기반으로하며 이는 코드 구성에 큰 영향을 미칩니다.

따라서 SOLID 원칙 을 따르는 Android 응용 프로그램에 적합한 아키텍처 패턴을 찾고 있다면 Android의 MVC 및 MVP 아키텍처 패턴에 대한 내 게시물에서 설명을 찾을 수 있습니다 .


2
그러한 자원을 제공하는 데 잘 끝났습니다! 감사!
Aleksandar

1
매우 유용한 링크!
Semaphor

나는 당신의 비디오 코스를 좋아합니다! 감사합니다
Viktor Apoyan 8

79

여기에 이미지 설명을 입력하십시오

이 게시물에 도달하면 실제로 예제로 패턴을 이해하는 데 도움이되므로 Android 프레임 워크에서 디자인 패턴 및 예제를 명확하게 볼 수 있도록 아래 표를 만들었습니다.

도움이 되길 바랍니다.


4
제발 편집 게시물을 텍스트 대신 스크린 샷과 실제 내용을 보여줍니다. 다른 사람은 이미지에서 복사하여 붙여 넣거나 오타 수정을 도와 줄 수 없습니다. 자세한 내용은 여기참조하십시오 . 감사합니다.
Pang


1
이 답변에 대해 감사합니다. 건축 패턴과 디자인 패턴이 너무 혼란 스럽지만 여전히 oo 디자인과 개발에 대해 한 가지 의문이 있습니다!? @ 피터 월터
Rucha Bhatt Joshi

@Burjua의 질문은 아키텍처를 참조하여 디자인 패턴을 언급하지만 동일하지 않기 때문에이 답변에 투표합니다. 나는이 답변이 원래의 질문에 대해 매우 유익하고 보완 적이라고 생각합니다
Xaren

이벤트 버스는 게시자 및 가입자 디자인 패턴을 사용합니다
Devrath

48

Android 프레임 워크에는 다음과 같은 다양한 패턴이 사용됩니다.

  • 브로드 캐스트 수신기는 관찰자 패턴을 사용합니다.
  • 원격 서비스 호출은 프록시 패턴을 사용합니다.
  • 보기 및보기 그룹은 복합 패턴을 사용합니다
  • 미디어 프레임 워크는 Facade 패턴을 사용합니다

5
링크 (참조)를 공유 해주시겠습니까?
shanraisshan

내가 그것에 대해 더 많이 찾을 수 있도록 참조를 공유하십시오. 감사합니다
에드 함자 하산

27

다음은 Android 용 공통 디자인 패턴에 대한 훌륭한 기사입니다 .

창조 패턴 :

  • 빌더 (예 : AlertDialog.Builder )
  • 의존성 주입 (예 : 단검 2 )
  • 하나씩 일어나는 것

구조 패턴 :

  • 어댑터 (예 : RecyclerView.Adapter )
  • 외관 (예 : 개조 )

행동 패턴 :

  • 명령 (예 : EventBus )
  • 관찰자 (예 : RxAndroid )
  • 모델 뷰 컨트롤러
  • Model View ViewModel ( 위의 MVC 패턴과 유사 )

1
기사의 요점은 좋을 것입니다.
Maxim G

이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다.
Bhargav Rao

이벤트 버스는 게시자 및 가입자 디자인 패턴을 사용합니다
Devrath

16

다음 Android 클래스는 디자인 패턴을 사용합니다.

1) 뷰 홀더는 싱글 톤 디자인 패턴을 사용합니다.

2) 의도는 공장 디자인 패턴을 사용

3) 어댑터는 어댑터 디자인 패턴을 사용합니다.

4) 방송 수신기는 관찰자 디자인 패턴을 사용

5) 뷰는 복합 디자인 패턴을 사용합니다

6) 미디어 프레임 워크는 파사드 디자인 패턴을 사용합니다


11

에서 알림 경우는이 NotificationCompat.Builder사용 빌더 패턴

처럼,

mBuilder = new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ic_stat_notification)
                    .setContentTitle(getString(R.string.notification))
                    .setContentText(getString(R.string.ping))
                    .setDefaults(Notification.DEFAULT_ALL);

3
이것은 실제로 빌더 패턴입니다.
Piovezan

@Piovezan 잘못되었습니다. 수정 해 주셔서 감사합니다. 데코레이터 패턴의 간단한 버전이라고 생각했습니다.
Jeff T.

6

안드로이드는 또한 ViewHolder 디자인 패턴을 사용합니다.

ListView를 스크롤하는 동안 성능을 향상시키는 데 사용됩니다.

ViewHolder 디자인 패턴을 사용하면 조회 할 필요없이 각 목록 항목보기에 액세스 할 수있어 소중한 프로세서주기를 절약 할 수 있습니다. 특히 ListView 스크롤 중에 findViewById ()를 자주 호출하지 않으므로 매끄럽게됩니다.


5

이러한 모든 패턴, MVC, MVVM , MVP 및 프리젠 테이션 모델 은 Android 앱에 적용 할 수 있지만 타사 프레임 워크가 없으면 잘 구성된 구조와 깨끗한 코드를 얻는 것이 쉽지 않습니다.

MVVM은 PresentationModel에서 시작되었습니다. MVC, MVVMPresentation Model 을 Android 앱에 적용 할 때 실제로 원하는 것은 명확한 구조화 된 프로젝트를 가지고 단위 테스트를 위해 더욱 중요하게하는 것입니다.

현재 타사 프레임 워크가 없으면 일반적으로 비즈니스 가치를 추가하지 않는 많은 코드 (addXXListener (), findViewById () 등)가 있습니다. 또한 일반적인 JUnit 테스트 대신 Android 단위 테스트를 실행해야합니다. 단위 테스트는 실행에 시간이 걸리고 단위 테스트는 다소 비현실적입니다.

이러한 이유로 몇 년 전에 우리 는 안드로이드 플랫폼을위한 데이터 바인딩 프레젠테이션 모델 프레임 워크 인 RoboBinding 이라는 오픈 소스 프로젝트를 시작했습니다 . RoboBinding을 사용하면 읽기, 테스트 및 유지 관리가 더 쉬운 UI 코드를 작성할 수 있습니다. RoboBinding은 addXXListener 와 같은 불필요한 코드 의 필요성을 제거하고 UI 로직을 POJO 인 프리젠 테이션 모델로 전환 하고 일반 JUnit 테스트 를 통해 테스트 할 수 있습니다 . RoboBinding 자체에는 품질을 보장하기 위해 300 개 이상의 JUnit 테스트가 제공됩니다.



1

Android에서 "작업 대기열 프로세서"패턴은 일반적으로 응용 프로그램의 메인 스레드에서 작업을 오프로드하는 데 사용됩니다.

예 : IntentService 클래스의 디자인

IntentService는 인 텐트를 수신하고 작업자 스레드를 시작한 다음 서비스를 적절히 중지합니다. 모든 요청은 단일 작업자 스레드에서 처리됩니다.


0

바인더는 죽음의 수신자 알림에 "Observer Pattern"을 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.