標籤:ddb 關注 post 不同 成本 name view 介面 tac
Android基礎——架構模式MVC在安卓中的實踐
本篇文章包含以下內容:
MVC的介紹
MVC (Model View Controller),是模型(model)視圖(view)控制器(controller)的縮寫,一種軟體設計模式,用於組織代碼用一種功能模組和資料模組分離的方法
- Model:模型層,負責處理資料的載入或者儲存
- View:視圖層,負責介面資料的展示,與使用者進行互動
- Controller:控制器層,負責邏輯業務的處理
MVC的模型關係圖:
MVC設計執行的基本流程:
首先視圖接受使用者輸入請求,然後將請求傳遞給控制器,控制器再調用某個模型來處理使用者的請求,在控制器的控制下,再將處理後的結果交給某個視圖進行格式化輸出給使用者。另外,View是可以直接存取Model來進行資料的處理的
對MVC的認識:
在MVC裡,View是可以直接存取Model的。從而,View裡會包含Model資訊,不可避免的還要包括一些商務邏輯。 在MVC模型裡,更關注的Model的不變,而同時有多個對Model的不同顯示,及View。所以,在MVC模型裡,Model不依賴於View,但是View是依賴於Model的。不僅如此,因為有一些商務邏輯在View裡實現了,導致要更改View也是比較困難的,至少那些商務邏輯是無法重用的
MVC優點:
- 耦合性低
- 重用性高
- 生命週期成本低
- 部署快
- 可維護性高
- 有利軟體工程化管理
MVC缺點:
- 沒有明確的定義
- 不適合小型,中等規模的應用程式
- 增加系統結構和實現的複雜性
- 視圖與控制器間的過於緊密的串連
- 視圖對模型資料的低效率訪問
- 一般進階的介面工具或構造器不支援模式
MVC的實踐
明白了MVC是什麼之後,我們使用個小案例來深入瞭解
我們採用ListView來示範我們的MVC模式,目錄結構:
實體類:包含了書的名字和圖片資訊
public class Book { //書名 private String name; //書的圖片 private int image; public Book(String name, int image) { this.name = name; this.image = image; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getImage() { return image; } public void setImage(int image) { this.image = image; }}
模型類(Model層):通常是對本機資料庫的操作或者是通過網路請求擷取網路資料的操作 我們在Model裡面類比了一個本機資料庫,並提供了增刪改查的方法
public class BookModel { private static List<Book> list = new ArrayList<>(); /** * 類比本機資料庫 */ static { list.add(new Book("Java從入門到精通", R.drawable.java)); list.add(new Book("Android從入門到精通", R.drawable.android)); list.add(new Book("Java從入門到精通", R.drawable.java)); list.add(new Book("Android從入門到精通", R.drawable.android)); } /** * 添加書本 * @param name * @param image */ public void addBook(String name, int image) { list.add(new Book(name, image)); } /** * 刪除書本 */ public void deleteBook( ) { list.remove(list.size() - 1); } /** * 查詢資料庫所有書本 * @return */ public List<Book> query() { return list; }}
控制器(Controller層):根據Model層的方法,加上我們的商務邏輯處理,對外提供方法並暴露介面
看delete這個方法,判斷List是否為空白(商務邏輯),使用mode.deleteBook()(Model層方法),通過listener.onComplete()(暴露介面)
public class BookController { private BookModel mode; public BookController() { mode = new BookModel(); } /** * 添加書本 * @param listener */ public void add(onAddBookListener listener) { mode.addBook("JavaWeb從入門到精通", R.drawable.javaweb); if (listener != null) { listener.onComplete(); } } /** * 刪除書本 * @param listener */ public void delete(onDeleteBookListener listener) { if(mode.query().isEmpty()){ return; }else{ mode.deleteBook(); } if (listener != null) { listener.onComplete(); } } /** * 查詢所有書本 * @return */ public List<Book> query() { return mode.query(); } /** * 添加成功的回調介面 */ public interface onAddBookListener { void onComplete(); } /** * 刪除成功的回調介面 */ public interface onDeleteBookListener { void onComplete(); }}
視圖(View層):我們操作Controller擷取List資料填充到ListView中,同時可以添加書本和刪除書本
public class BookActivity extends AppCompatActivity implements View.OnClickListener { private BookController bookController; private ListView lv_book; private List<Book> list; private BookAdapter adapter; private Button bt_add, bt_delete; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_book); lv_book = (ListView) findViewById(R.id.lv); bt_add = (Button) findViewById(R.id.bt_add); bt_delete = (Button) findViewById(R.id.bt_delete); bt_add.setOnClickListener(this); bt_delete.setOnClickListener(this); bookController = new BookController(); list = bookController.query(); adapter = new BookAdapter(this, list); lv_book.setAdapter(adapter); } @Override public void onClick(View v) { switch (v.getId()) { //添加書本按鈕 case R.id.bt_add: bookController.add(new BookController.onAddBookListener() { @Override public void onComplete() { adapter.notifyDataSetChanged(); } }); break; //刪除書本按鈕 case R.id.bt_delete: bookController.delete(new BookController.onDeleteBookListener() { @Override public void onComplete() { adapter.notifyDataSetChanged(); } }); break; } }}
聲明:此文章轉載於http://blog.csdn.net/qq_30379689/article/details/52909656
安卓入門常見架構之mvc