Android MVP与MVC框架模式

本文对比分析了MVP(Model-View-Presenter)与MVC(Model-View-Controller)两种软件架构模式的区别。重点阐述了MVP模式如何通过Presenter降低Model与View之间的耦合度,提高系统的扩展性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MVP与MVC模式

MVC在我们开发过程中比较常见,就不进行详细解释,主要看下二者的区别。
(1)MVP与MVC名称上就可以看出来,MVP中使用Presenter代替了之前的Controller,Presenter可以被我们理解为一个中间人,也是主要负责业务逻辑的处理,但是它与Controller又有不同之处。
(2)MVC规范不够明确,MVP规范更加明确,在系统扩展方面也更加灵活。
(3)其实二者最本质的区别是View与Model没有直接联系,通过下面这幅图体现出来的。
这里写图片描述
拿ListView来讲,以前使用MVC模式的时候通常View指的是一个Activity,但有时候Activity还被作为Controller控制器,虽然MVC模式是想将业务逻辑、数据、界面显示分离但在实际应用中这种分离并不明显,而且通过上图可以看出来,Model与View相互影响,当你的Model(数据)发生改变时可能会影响到View,二者联系还是比较多的(这就是上面所说的规范不够明确)。而在MVP中Presenter作为一个中间人联系这View与Model,当Model改变时并不影响View,如果需要进行修改,只需要在Presenter中进行,从而减少了Model与View的联系,降低了耦合度。

MVP实例

这里写图片描述
以ListView为例,布局跟Adapter代码不进行展示。
思路:根据MVP模式知道需要有Model、View、Presenter。首先是Model,Model中加载数据(所以demo中有load()方法)、View显示数据(所以demo中写了showview()方法)、Presenter对二者进行绑定(所以demo中有bind()方法),根据上面的MVP模式图可以看出Presenter将持有Model和View,在但在实际开发中考虑可扩展性,一般都是获得Model和View的接口。

Model

接口

public interface IFruitModel {
       void loadFruits(FruitOnloadListener listener);
       interface FruitOnloadListener{
           void onLoadFinish(List<Fruit> fruits);
       }
}

具体数据加载

public class FruitModel implements IFruitModel{

    @Override
    public void loadFruits(FruitOnloadListener listener) {
        List<Fruit> fruits=new ArrayList<Fruit>();
        fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
        fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
        fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
        fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));        
        fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
        fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));        
        fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
        fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
        listener.onLoadFinish(fruits);

    }

View

该接口将被Acivity实现

public interface IFruitView {
    /**
     * 显示
     * @param fruits
     */
    void showFruitView(List<Fruit> fruits);
}

Presenter

public class Presenter {
    // 需要持有View和Model接口
    private IFruitView mFruitView;
    private IFruitModel mFruitModel = new FruitModel();

    public Presenter(IFruitView mFruitView) {
        super();
        this.mFruitView = mFruitView;
    }

    public void bind() {
    //进行数据与View的绑定,并回调showview方法,
//一般MVC中Activity担任controller,此时MVP中由Presenter回调实现。
        mFruitModel.loadFruits(new IFruitModel.FruitOnloadListener() {

            @Override
            public void onLoadFinish(List<Fruit> fruits) {

                mFruitView.showFruitView(fruits);
            }
        });
    }

}

MainActivity

public class MainActivity extends Activity implements IFruitView {
    private ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView = (ListView) findViewById(R.id.listview);
        new Presenter(this).bind();
    }

    @Override
    public void showFruitView(List<Fruit> fruits) {
        FruitAdapter adapter = new FruitAdapter(fruits, this);
        mListView.setAdapter(adapter);
    }

}

这样View与Model没有直接联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值