Android的MVP框架

来源:互联网 发布:win7网络栏无法显示 编辑:程序博客网 时间:2024/05/13 06:36


首先来说一下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>





0 0