安卓入門常見架構之mvc


Android基礎——框架模式MVC在安卓中的實踐


本篇文章包含以下內容:

  • MVC的介紹
  • 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM