国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

MVP模式

2019-11-09 17:12:00
字體:
來源:轉載
供稿:網友

轉載請標明出處:

http://blog.csdn.net/mollyxiong/article/details/54925663;

本文出自:【MollyShong博客】

一個簡單的發送內容的demo 先上效果圖MVP模式的結構一、什么是MVP模式?    分離view 與 model 層的功能,使得程序更加清晰 提高分離 解耦性,減輕activity的工作量 將業務代碼單獨抽取出來,各自負責各自層應該做的事情。簡單一句話說就是基于MVC模式演變而來,提高代碼結構清晰度,提高程序解耦性可維護性的模式。    接下來我們具體梳理下MVP究竟是什么    M 對應的Model 數據層,負責操作、獲取數據    V 對應的是View 也就是Activity層,負責UI、與用戶進行交互    P PResenter 就是我們要分離的業務邏輯層,連接view和model層,處理業務邏輯。二、為什么要用MVP模式?    Android開發不同于javaWeb開發的是利用MVC模式 使得控制器和展示層完全分離,但是Android中activity有控制器也有view做的事情,如果把布局文件單獨分成view層,幾乎就沒有做什么事情,而activity還承擔了部分view層的工作,到最后需求越來越多,activity也會越來也胖。所以在Android開發中可以使用MVP模式來清晰的分離各自層的工作。同樣也利于單元測試。三、MVP模式怎么用?    view層專門負責UI及用戶交互    Persenter層負責所有的業務邏輯的處理    Model層負責數據的獲取、操縱    各個層單獨分離,用層與層之間用接口交互下面我們來看一個簡單的Demo    Acitivity  也就是view層 實現了ViewInterface接口,分離業務邏輯
public class MainActivity extends AppCompatActivity implements ViewInterface, View.OnClickListener {    private EditText content;    private EditText author;    private Button send;    private Button clean;    private ProgressBar loading;    private PresenterImpl presenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    public void initView(){        content = (EditText) findViewById(R.id.content);        author = (EditText) findViewById(R.id.author);        loading = (ProgressBar) findViewById(R.id.loading);        send = (Button) findViewById(R.id.send);        clean = (Button) findViewById(R.id.clean);        send.setOnClickListener(this);        clean.setOnClickListener(this);        presenter = new PresenterImpl(this);    }    /**     * 顯示和隱藏進度條     */    @Override    public void showProgressBar() {        loading.setVisibility(View.VISIBLE);    }    @Override    public void hideProgressBar() {        loading.setVisibility(View.GONE);    }    /**     * 發送是成功還是失敗各自需要做的事情     */    @Override    public void sendSuccess() {        Toast.makeText(this,"發送成功!",Toast.LENGTH_SHORT).show();    }    @Override    public void sendFailed() {        Toast.makeText(this,"發送失敗!",Toast.LENGTH_SHORT).show();    }    /**     * 清除發送內容     */    @Override    public void cleanContent() {        content.setText("");    }    @Override    public void cleanAuthor() {        author.setText("");    }    /**     * 獲取內容和作者     */    @Override    public String getContent() {        return content.getText().toString().trim();    }    @Override    public String getAuthor() {        return author.getText().toString().trim();    }    /**     * Called when a view has been clicked.     * @param v The view that was clicked.     */    @Override    public void onClick(View v) {        switch( v.getId()){            case R.id.send:                presenter.send();                break;            case R.id.clean:                presenter.clean();                break;        }    }    @Override    protected void onDestroy() {        presenter.destroy();        super.onDestroy();    }}ViewInterface

/** * Created by Administrator on 2017/2/7. * view 層的接口,定義view 的所有動作  view通常是指activity 讓activity去實現本接口 * view 和 presenter 互相持有引用 */public interface ViewInterface {    /**     * 顯示和隱藏進度條     */    public void showProgressBar();    public void hideProgressBar();    /**     * 發送是成功還是失敗各自需要做的事情     */    public void sendSuccess();    public void sendFailed();    /**     * 清除發送內容     */    public void cleanContent();    public void cleanAuthor();    /**     * 獲取內容和作者     */    public String getContent();    public String getAuthor();}

業務邏輯層
/** * Created by Administrator on 2017/2/7. * * 控制 業務層,處理所有的業務邏輯,連接view 和 model */public interface PresenterInterface {    public void send();    public void destroy();    public void clean();}從view層獲取數據 ,做完相應的業務處理,把事情交給model校驗數據,返回結果,根據結果控制view做出相應的UI處理
/** * Created by Administrator on 2017/2/7. */public class PresenterImpl implements PresenterInterface {    ViewInterface viewInterface;    ModelImpl model;    private Handler mHandler = new Handler();    public PresenterImpl() {    }    public PresenterImpl(ViewInterface viewInterface) {        this.viewInterface = viewInterface;        model = new ModelImpl();    }    @Override    public void send() {        //顯示進度條        viewInterface.showProgressBar();        model.send(viewInterface.getContent(), viewInterface.getAuthor(), new ModelInterface.OnSendLinterer() {            @Override            public void sendSuccess() {                mHandler.post(new Runnable() {                    @Override                    public void run() {                        viewInterface.sendSuccess();                        viewInterface.hideProgressBar();                    }                });            }            @Override            public void sendFailed() {                mHandler.post(new Runnable() {                    @Override                    public void run() {                        viewInterface.sendFailed();                        viewInterface.hideProgressBar();                    }                });            }        });    }    @Override    public void destroy() {        viewInterface = null;        model.destory();        model = null;    }    @Override    public void clean() {        viewInterface.cleanAuthor();        viewInterface.cleanContent();    }}數據層
/** * Created by Administrator on 2017/2/7. * * 數據層,做的事情就是為Presenter層提供數據 */public interface ModelInterface {    interface OnSendLinterer{        void sendSuccess();        void sendFailed();    }    public void send(String content, String author, OnSendLinterer onSendLinterer);}發送數據請求發送內容是否成功,這里用的是模擬
/** * Created by Administrator on 2017/2/7. */public class ModelImpl implements ModelInterface {    private ExecutorService executorService ;    public ModelImpl(){        //獲取一個線程池 根據 虛擬機可用的處理器的最大數量 +1 定義線程池大小        executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()+1);    }    @Override    public void send(String content, String author,final OnSendLinterer onSendLinterer) {        executorService.execute(new Runnable() {            /**             * When an object implementing interface <code>Runnable</code> is used             * to create a thread, starting the thread causes the object's             * <code>run</code> method to be called in that separately executing             * thread.             * <p>             * The general contract of the method <code>run</code> is that it may             * take any action whatsoever.             *             * @see Thread#run()             */            @Override            public void run() {                //模擬網絡請求的耗時操作                try {                    Thread.sleep(2000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                //隨機boolean 模擬發送成功或失敗                Random random = new Random();                if( random.nextBoolean() ){                    onSendLinterer.sendSuccess();                }else{                    onSendLinterer.sendFailed();                }            }        });        //不再接受新的任務//        executorService.shutdown();        /*try {            future.get();        } catch (InterruptedException e) {            e.printStackTrace();        } catch (ExecutionException e) {            e.printStackTrace();        }*/    }    public void destory(){        executorService = null;    }}項目的結構 四、MVP模式什么時候用?    可能有朋友會覺得MVP是為了模式而模式,開發中類變得多了,感覺還更加復雜了。我們知道,當需求過多過于復雜的時候,activity的代碼量就會越來越多,可能一個activity中會有幾千行代碼,極大的影響了后期的維護和開發的成本。如果用上MVP就能極大限度的將activity中展示 業務處理 數據存取單獨分離出來,雖然類文件增加了不少,但是整體來看程序和代碼的結構還是很清晰的。所以,應用層開發的項目個人覺得使用MVP都是比較合適的。使用MVP模式,建議按功能分包,利于后面的維護和開發最后附上Demo的下載鏈接: github
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳新县| 茂名市| 肥东县| 山阳县| 衡水市| 仪征市| 衡水市| 新余市| 屏边| 尚志市| 贡觉县| 广灵县| 武汉市| 什邡市| 安康市| 论坛| 政和县| 宾川县| 巴东县| 宁乡县| 新余市| 农安县| 吉首市| 北海市| 福鼎市| 米泉市| 平塘县| 防城港市| 霍城县| 鸡西市| 罗山县| 顺平县| 北流市| 西昌市| 高要市| 余江县| 吐鲁番市| 元氏县| 台南县| 独山县| 民权县|