Những mẫu kiến ​​trúc nào được sử dụng trên Android? [đóng cửa]


268

Tôi đang thực hiện một nghiên cứu nhỏ về nền tảng di động và tôi muốn biết những mẫu thiết kế nào được sử dụng trong Android?

ví dụ: trong Trình điều khiển chế độ xem mô hình iOS được sử dụng rất rộng rãi cùng với ủy quyền và các mẫu khác.

Android sử dụng những mẫu nào và đặc biệt ở đâu?

BIÊN TẬP

Tôi không yêu cầu các mẫu thiết kế được sử dụng sâu trong kernel, dalvik, v.v., nhưng về các mẫu mà nhà phát triển ứng dụng sẽ gặp trong khi phát triển ứng dụng.


2
Với nền tảng Android kết hợp với nhân Linux, đây là bộ phần mềm quá lớn để trả lời câu hỏi này ngoài 'tất cả các mẫu được đặt tên cho đến nay và có thể là một vài mẫu mới nếu bạn xem xét kỹ'
Pete Kirkham

5
@Pete, Ok, có lẽ bạn đúng, nhưng đồng thời tôi sẽ không đi sâu như kernel, tôi quan tâm đến bề mặt của ứng dụng, ví dụ như trong iOS được UIViewControllertriển khai bằng MVC ( UIViewControllerlà một bộ điều khiển và root của nó UIViewlà view) , UIApplicationsử dụng phái đoàn có Đại biểu ứng dụng làm đại biểu và cứ thế ...
Burjua

4
Tôi nghĩ bạn nên thực sự học Android từ dưới lên và không cố gắng "chuyển" kiến ​​thức từ iOS sang Android. Có rất nhiều cuốn sách tuyệt vời ngoài kia. Apress làm cho một bó. Nếu bạn hiểu vòng đời của ứng dụng và dịch vụ trong Android, bạn sẽ có thể có được cách giải quyết các ứng dụng đúng cách.
đồ bịt mắt


Điều này có thể giúp: stackoverflow.com/a/49694378
Ali Nem

Câu trả lời:


324

Tôi đã thử sử dụng cả bộ điều khiển mô hình xem bộ điều khiển mô hình (MVC) và mô hình kiến trúc của người xem trình bày mô hình xem để phát triển Android. Những phát hiện của tôi là mô hình bộ điều khiển xem mô hình của Google hoạt động tốt, nhưng có một số "vấn đề". Tất cả phụ thuộc vào cách bạn cảm nhận về Activitylớp Android . Nó là một bộ điều khiển, hay nó là một khung nhìn?

Lớp thực tế Activitykhông mở rộng Viewlớp của Android , tuy nhiên, nó xử lý việc hiển thị một cửa sổ cho người dùng và cũng xử lý các sự kiện của cửa sổ đó (onCreate, onPause, v.v.).

Điều này có nghĩa là, khi bạn đang sử dụng một mẫu MVC, bộ điều khiển của bạn thực sự sẽ là một bộ điều khiển giả xem. Vì nó đang xử lý hiển thị một cửa sổ cho người dùng, với các thành phần khung nhìn bổ sung mà bạn đã thêm vào nó với setContentView và cũng xử lý các sự kiện cho ít nhất các sự kiện vòng đời hoạt động khác nhau.

Trong MVC, bộ điều khiển được coi là điểm vào chính. Đó là một chút tranh cãi nếu đây là trường hợp khi áp dụng nó vào phát triển Android, vì hoạt động này là điểm vào tự nhiên của hầu hết các ứng dụng.

Chính vì điều này, cá nhân tôi thấy rằng mô hình người dẫn chương trình mô hình xem view là một sự phù hợp hoàn hảo để phát triển Android. Vì vai trò của khung nhìn trong mẫu này là:

  • Phục vụ như là một điểm nhập cảnh
  • Linh kiện kết xuất
  • Định tuyến sự kiện người dùng đến người trình bày

Điều này cho phép bạn thực hiện mô hình của mình như vậy:

Xem - phần này chứa các thành phần UI của bạn và xử lý các sự kiện cho chúng.

Người thuyết trình - điều này sẽ xử lý giao tiếp giữa mô hình của bạn và chế độ xem của bạn, xem nó như một cửa ngõ cho mô hình của bạn. Có nghĩa là, nếu bạn có một mô hình miền phức đại diện, Chúa biết điều gì và chế độ xem của bạn chỉ cần một tập hợp con rất nhỏ của mô hình này, công việc của người thuyết trình là truy vấn mô hình và sau đó cập nhật chế độ xem. Ví dụ: nếu bạn có một mô hình chứa một đoạn văn bản, một tiêu đề và một từ đếm. Nhưng trong một chế độ xem nhất định, bạn chỉ cần hiển thị tiêu đề trong chế độ xem. Sau đó, người trình bày sẽ đọc dữ liệu cần thiết từ mô hình và cập nhật khung nhìn phù hợp.

Mô hình - về cơ bản nên là mô hình miền đầy đủ của bạn. Hy vọng rằng nó cũng sẽ giúp làm cho mô hình miền của bạn "chặt chẽ" hơn, vì bạn sẽ không cần các phương pháp đặc biệt để giải quyết các trường hợp như đã đề cập ở trên.

Bằng cách tách rời mô hình khỏi chế độ xem cùng nhau (thông qua việc sử dụng người trình bày), nó cũng trở nên trực quan hơn nhiều để kiểm tra mô hình của bạn. Bạn có thể có các bài kiểm tra đơn vị cho mô hình miền của mình và kiểm tra đơn vị cho người thuyết trình của bạn.

Hãy thử nó. Cá nhân tôi thấy nó rất phù hợp để phát triển Android.


14
Câu trả lời chính xác! Tôi có câu hỏi mặc dù: 1. Hoạt động = Xem, tôi đã hiểu đúng chưa? 2. Bạn sẽ triển khai người trình bày dưới dạng lớp công khai của riêng mình hay là lớp bên trong của Hoạt động? Hoặc một mảnh (cũng là lớp bên trong)? 3. Bạn có nghĩa là các lớp chuyển sẽ được sử dụng thay cho các lớp mô hình thực tế trong Hoạt động (dạng xem) không?
manody

14
1. Có, tôi sử dụng chúng làm chế độ xem trong mẫu MVP. 2. Cá nhân, tôi phân chia chúng thành các lớp công khai riêng lẻ, nhưng đây là vấn đề sở thích tôi cho rằng :) 3. Tôi đã giải thích điều này khá kém, câu "chuyển tiếp các lớp cần thiết" là sai lệch. Ý tôi là, người trình bày ngồi giữa khung nhìn và mô hình, nó đọc mô hình và sau đó cập nhật khung nhìn. Tôi sẽ cập nhật câu trả lời của mình để rõ ràng hơn một chút :)
JustDanyul

cảm ơn vì đã dành thời gian, tôi hiểu ngay bây giờ :)
manody

11
Tôi thực sự thực sự yêu thích sự phát triển của Android vì nó rất tách rời. Cách tôi sử dụng MVC: Sử dụng Hoạt động hoàn toàn cho IO người dùng và sử dụng dịch vụ cục bộ cho tất cả quá trình xử lý của bạn. Khi dịch vụ muốn hiển thị một cái gì đó - hãy phát nó đến các hoạt động của bạn! Tôi thực sự ghét nó khi các nhà phát triển khác xử lý quá nhiều hoạt động.
Ai đó ở đâu đó vào

8
@SomeoneSomewhere tại sao không có một lớp xử lý công cụ này trong luồng / AsyncT task riêng biệt, tại sao lại là một dịch vụ?
Cậu bé

87

Cập nhật tháng 11 năm 2018

Sau khi làm việc và viết blog về MVC và MVP trong Android trong vài năm (xem phần thân của câu trả lời bên dưới), tôi quyết định nắm bắt kiến ​​thức và hiểu biết của mình ở dạng toàn diện hơn và dễ tiêu hóa hơn.

Vì vậy, tôi đã phát hành một khóa học video đầy đủ về kiến ​​trúc ứng dụng Android. Vì vậy, nếu bạn muốn làm chủ các mẫu kiến ​​trúc tiên tiến nhất trong phát triển Android, hãy xem khóa học toàn diện này tại đây .

Câu trả lời này đã được cập nhật để duy trì liên quan kể từ tháng 11 năm 2016


Có vẻ như bạn đang tìm kiếm các mẫu kiến ​​trúc hơn là các mẫu thiết kế .

Các mẫu thiết kế nhằm mục đích mô tả một "mẹo" chung mà lập trình viên có thể thực hiện để xử lý một tập hợp các nhiệm vụ phần mềm định kỳ cụ thể. Ví dụ: Trong OOP, khi có nhu cầu cho một đối tượng thông báo cho một tập hợp các đối tượng khác về một số sự kiện, mẫu thiết kế quan sát viên có thể được sử dụng.

Vì các ứng dụng Android (và hầu hết AOSP) được viết bằng Java, hướng đối tượng, tôi nghĩ bạn sẽ gặp khó khăn khi tìm kiếm một mẫu thiết kế OOP duy nhất KHÔNG được sử dụng trên Android.

Mặt khác, các mẫu kiến ​​trúc không giải quyết các nhiệm vụ phần mềm cụ thể - chúng nhằm mục đích cung cấp các mẫu cho tổ chức phần mềm dựa trên các trường hợp sử dụng của thành phần phần mềm được đề cập.

Nghe có vẻ hơi phức tạp, nhưng tôi hy vọng một ví dụ sẽ làm rõ: Nếu một ứng dụng nào đó sẽ được sử dụng để tìm nạp dữ liệu từ máy chủ từ xa và trình bày cho người dùng theo cách có cấu trúc, thì MVC có thể là một ứng cử viên tốt để xem xét. Lưu ý rằng tôi không nói gì về các tác vụ phần mềm và luồng chương trình của ứng dụng - Tôi chỉ mô tả nó theo quan điểm của người dùng và một ứng cử viên cho một mẫu kiến ​​trúc đã xuất hiện.

Vì bạn đã đề cập đến MVC trong câu hỏi của mình, tôi đoán rằng các mẫu kiến ​​trúc là thứ bạn đang tìm kiếm.

Nhập mô tả hình ảnh ở đây


Trong lịch sử, không có hướng dẫn chính thức nào của Google về kiến ​​trúc của ứng dụng, điều này (trong số các lý do khác) dẫn đến sự lộn xộn trong mã nguồn của ứng dụng Android. Trên thực tế, ngay cả ngày nay hầu hết các ứng dụng mà tôi thấy vẫn không tuân theo các thực tiễn tốt nhất của OOP và không hiển thị một tổ chức mã logic rõ ràng.

Nhưng ngày nay tình hình đã khác - Google gần đây đã phát hành thư viện Data Binding , được tích hợp hoàn toàn với Android Studio và thậm chí, đã tung ra một bộ bản thiết kế kiến ​​trúc cho các ứng dụng Android .

Hai năm trước, rất khó để tìm thấy thông tin về MVC hoặc MVP trên Android. Ngày nay, MVC, MVP và MVVM đã trở thành "từ ngữ" trong cộng đồng Android và chúng tôi được bao quanh bởi vô số chuyên gia luôn cố gắng thuyết phục chúng tôi rằng MVx tốt hơn MVy. Theo tôi, thảo luận về việc MVx có tốt hơn MVy hay không là hoàn toàn vô nghĩa vì bản thân các thuật ngữ rất mơ hồ - chỉ cần nhìn vào câu trả lời cho câu hỏi này , và bạn sẽ nhận ra rằng những người khác nhau có thể liên kết những từ viết tắt này với các cấu trúc hoàn toàn khác nhau.

Do việc tìm kiếm một mẫu kiến ​​trúc tốt nhất cho Android đã chính thức được bắt đầu, tôi nghĩ rằng chúng ta sắp thấy một số ý tưởng khác được đưa ra ánh sáng. Tại thời điểm này, thực sự không thể dự đoán mô hình (hoặc mẫu) nào sẽ trở thành tiêu chuẩn công nghiệp trong tương lai - chúng ta sẽ cần chờ xem (tôi đoán đó là vấn đề của một hoặc hai năm).

Tuy nhiên, có một dự đoán tôi có thể đưa ra với độ tin cậy cao: Việc sử dụng thư viện Binding Data sẽ không trở thành một tiêu chuẩn công nghiệp. Tôi tự tin nói rằng vì thư viện Binding dữ liệu (đang triển khai hiện tại) cung cấp tăng năng suất ngắn hạn và một số hướng dẫn kiến ​​trúc, nhưng về lâu dài nó sẽ khiến mã không thể duy trì được. Một khi các hiệu ứng dài hạn của thư viện này sẽ xuất hiện - nó sẽ bị bỏ rơi.


Bây giờ, mặc dù chúng ta có một số loại hướng dẫn và công cụ chính thức ngày hôm nay, cá nhân tôi, không nghĩ rằng những hướng dẫn và công cụ này là những lựa chọn tốt nhất có sẵn (và chúng chắc chắn không phải là những công cụ duy nhất). Trong các ứng dụng của mình, tôi sử dụng triển khai kiến ​​trúc MVC của riêng mình. Nó đơn giản, sạch sẽ, dễ đọc và có thể kiểm tra và không yêu cầu bất kỳ thư viện bổ sung nào.

MVC này không chỉ khác biệt về mặt thẩm mỹ so với các loại khác - nó dựa trên lý thuyết rằng các Hoạt động trong Android không phải là Các thành phần UI , có ý nghĩa rất lớn đối với tổ chức mã.

Vì vậy, nếu bạn đang tìm kiếm một mẫu kiến ​​trúc tốt cho các ứng dụng Android tuân theo các nguyên tắc RẮN , bạn có thể tìm thấy một mô tả về một trong bài viết của tôi về các mẫu kiến ​​trúc MVC và MVP trong Android .


2
Cũng được thực hiện để cung cấp các tài nguyên như vậy! Cảm ơn!
Alexanderar

1
Liên kết rất hữu ích!
Semaphor

Tôi thích khóa học video của bạn! Cảm ơn
Viktor Apoyan

79

nhập mô tả hình ảnh ở đây

Khi tôi đạt được bài đăng này, nó thực sự giúp tôi hiểu các mẫu với ví dụ vì vậy tôi đã tạo bảng dưới đây để thấy rõ các mẫu Thiết kế & ví dụ của chúng trong Android Framework

Tôi hy vọng bạn sẽ tìm thấy nó hữu ích.


4
Vui lòng chỉnh sửa bài đăng của bạn và hiển thị nội dung thực tế dưới dạng văn bản thay vì ảnh chụp màn hình. Những người khác không thể sao chép và dán từ hình ảnh của bạn hoặc giúp bạn sửa lỗi chính tả. Xem ở đây để biết chi tiết. Cảm ơn bạn.
Pang


1
Cảm ơn bạn vì câu trả lời này Tôi đã rất bối rối giữa các công trình kiến ​​trúc và các mẫu thiết kế, tôi vẫn còn một câu hỏi oo-thiết kế và phát triển là gì!? @Peter Walter
Rucha Bhatt Joshi

Tôi bỏ phiếu cho câu trả lời này bởi vì mặc dù câu hỏi của @Burjua có đề cập đến các mẫu thiết kế bằng cách tham khảo các kiến ​​trúc nhưng chúng không giống nhau. Tôi xem câu trả lời này rất nhiều thông tin và bổ sung cho câu hỏi ban đầu
Xaren

Xe buýt sự kiện sử dụng mẫu thiết kế của nhà xuất bản và người đăng ký
Devrath

48

Có nhiều mẫu khác nhau được sử dụng trong khung Android như:

  • Bộ thu phát sử dụng mẫu Observer
  • Gọi dịch vụ Remoter sử dụng mẫu Proxy
  • Xem và xem nhóm sử dụng mẫu Tổng hợp
  • Khung phương tiện sử dụng mẫu Mặt tiền

5
bạn có thể vui lòng chia sẻ các liên kết (tài liệu tham khảo)
shanraisshan

hãy chia sẻ tài liệu tham khảo để tôi có thể tìm hiểu thêm về nó. Cảm ơn
Syed Hamza Hassan

27

Đây là một bài viết tuyệt vời về các mẫu thiết kế chung cho Android :

Mẫu sáng tạo:

  • Trình tạo (ví dụ: AlertDialog.Builder )
  • Phụ thuộc tiêm (ví dụ Dagger 2 )
  • Người độc thân

Mô hình kết cấu:

  • Bộ điều hợp (ví dụ RecyclerView.Ad CHƯƠNG )
  • Mặt tiền (ví dụ trang bị thêm )

Mẫu hành vi:

  • Lệnh (ví dụ: EventBus )
  • Người quan sát (ví dụ RxAndroid )
  • Bộ điều khiển xem mô hình
  • Model View ViewModel ( tương tự mẫu MVC ở trên )

1
Điểm chính từ bài viết sẽ tốt đẹp.
Maxim G

Trong khi điều này về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Bhargav Rao

Xe buýt sự kiện sử dụng mẫu thiết kế của nhà xuất bản và người đăng ký
Devrath

16

Các lớp Android sau sử dụng các mẫu thiết kế

1) View Chủ sử dụng Mẫu thiết kế Singleton

2) Ý định sử dụng Mẫu thiết kế nhà máy

3) Bộ điều hợp sử dụng Mẫu thiết kế bộ điều hợp

4) Thiết bị thu phát sóng sử dụng Mẫu thiết kế quan sát

5) Chế độ xem sử dụng Mẫu thiết kế tổng hợp

6) Media FrameWork sử dụng Mẫu thiết kế Façade


11

Trong trường hợp Thông báo , NotificationCompat.Buildersử dụng Mẫu xây dựng

giống,

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
Đây thực sự là mẫu Builder.
Piovezan

@Piovezan Tôi sai rồi. Cảm ơn bạn đã sửa chữa cho tôi. Tôi nghĩ đó là một phiên bản đơn giản của Mẫu trang trí.
Jeff T.

6

Android cũng sử dụng mẫu thiết kế ViewHolder.

Nó được sử dụng để cải thiện hiệu suất của ListView trong khi cuộn nó.

Mẫu thiết kế ViewHolder cho phép bạn truy cập từng chế độ xem danh sách mà không cần tra cứu, lưu các chu kỳ bộ xử lý có giá trị. Cụ thể, nó tránh các cuộc gọi thường xuyên của findViewById () trong quá trình cuộn ListView và điều đó sẽ làm cho nó trơn tru.


5

Tất cả các mẫu này, MVC, MVVM , MVP và Mô hình trình bày , có thể được áp dụng cho các ứng dụng Android, nhưng không có khung của bên thứ ba, không dễ để có được cấu trúc được tổ chức tốt và mã sạch.

MVVM có nguồn gốc từ PresentationModel. Khi chúng tôi áp dụng MVC, MVVMMô hình trình bày cho ứng dụng Android, điều chúng tôi thực sự muốn là có một dự án có cấu trúc rõ ràng và quan trọng hơn là dễ dàng hơn cho các bài kiểm tra đơn vị.

Hiện tại, không có khung của bên thứ ba, bạn thường có rất nhiều mã (như addXXListener (), findViewById (), v.v.), không thêm bất kỳ giá trị doanh nghiệp nào. Hơn nữa, bạn phải chạy thử nghiệm đơn vị Android thay vì thử nghiệm JUnit thông thường, mất nhiều thời gian để chạy và làm cho thử nghiệm đơn vị hơi không thực tế.

Vì những lý do này, vài năm trước chúng tôi đã bắt đầu một dự án nguồn mở, RoboBinding - Khung mô hình trình bày ràng buộc dữ liệu cho nền tảng Android. RoboBinding giúp bạn viết mã UI dễ đọc, kiểm tra và bảo trì hơn. RoboBinding loại bỏ sự cần thiết của mã không cần thiết như addXXListener hoặc như vậy , và chuyển logic UI sang Mô hình trình bày, là POJO và có thể được kiểm tra thông qua các bài kiểm tra JUnit thông thường . Bản thân RoboBinding đi kèm với hơn 300 bài kiểm tra JUnit để đảm bảo chất lượng của nó.



1

Trong Android, mẫu "bộ xử lý hàng đợi công việc" thường được sử dụng để giảm tải các tác vụ từ luồng chính của ứng dụng.

Ví dụ: Thiết kế của lớp IntentService.

IntentService nhận Intent, khởi chạy một luồng worker và dừng dịch vụ khi thích hợp. Tất cả các yêu cầu được xử lý trên một luồng worker.


0

Binder sử dụng "Mẫu quan sát" cho các thông báo Người nhận chết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.