Android的MVP框架


首先来说一下MVC和MVP的区别:


MVC(Model-View-Controller),这种模式下三种模型的交互关系如下:



缺点:view可以直接访问model(比如我们经常在activity中直接操作SQLite、SharedPreference中的数据),同时view中可能会包含业务逻辑(比如我们经常把一个点击事件的处理写在activity里,这样就使得view层和controller层混在一起,使得view无法重用)。尽管MVC的提出旨在使程序的数据和页面分离,通过controller去控制二者之间的联系,但实际view仍是依赖model的,而且view和controller耦合不清。



MVP(Model-View-Presenter),这种模式解决了MVC的两个缺点,它的三种模型交互关系如下:


view和model之间完全切断了联系,对model的操作完全放在了presenter里;view不再包含任何逻辑的处理,所有逻辑完全交给presenter。这样对于相同的业务逻辑但不同的界面,presenter就可以复用;相同的页面、不同的业务逻辑实现,view就可以复用。这种模式使得view的作用仅仅只是显示页面,它不能获取或操作数据、不能包含对逻辑的处理。



通过上述分析,MVP和MVC之间的区别就是:在MVP中,View与Model并不直接交互,所有的交互放在Presenter中;而在MVC里,View与Model会直接产生一定的交互



下面通过一个特别简单的demo来理解一下MVP的原理,demo的功能是:点击Button会生成一个随机数,在TextView中显示出来。

<span style="font-family:Arial;">public class Contract {

    public interface View{
        void setText(String str);
    }

    public interface Presenter{
        void getRandomInt();
    }
}


public class MainActivity extends Activity implements Contract.View{

    TextView tv;
    Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.tv);
        btn = (Button) findViewById(R.id.btn);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getPresenter().getRandomInt();
            }
        });
    }

    private Contract.Presenter getPresenter(){
        return new MyPresenter(this);
    }

    @Override
    public void setText(String str) {
        tv.setText(str);
    }
}


public class MyPresenter implements Contract.Presenter{

    private Contract.View mView;

    public MyPresenter(Contract.View view){
        mView = view;
    }

    @Override
    public void getRandomInt() {
        mView.setText("" + new Random().nextInt(100));
    }
}</span>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值