android开发系列之MVP设计模式
近期在开发设计一个android的新项目中,发觉了一个很好用的策略模式(MVP)。大伙儿很有可能一见到这一姓名就有点儿蒙,MVP究竟是什么鬼呢?它的功能强大究竟反映在哪呢?不要着急,下边就要大家一一共享出去。
说到MVP,大伙儿或许便会想起MVC。没有错,实际上她们彼此之间的确有非常大的联络,MVC对比大伙儿全是十分的了解了,典型性的三层架构。可是MVC在应用的全过程中有哪些缺点呢?就自己的理解是它会造成Control层和Model层对接太密不可分,由于有的情况下你务必从Model里边读写能力数据信息。而MVP 呢?它是在Model和View中间加了个Presenter层,全部的互动都产生在Presenter层里边。见到这儿,有些人便会讲了,那这不是跟MVC一样的吗?我看不出来有什么不同呀?下边就要大家讨论一下具体编码,或许你也就能领悟出一些物品了。
假如我前台接待有那么个Activity,编码以下:
public class MyTestActivity extends Activity implements View.OnClickListener { private Button btnTest1,btnTest2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_test); initView(); setClickLinear(); } private void initView(){ btnTest1=(Button)findViewById(R.id.btnTest1); btnTest2=(Button)findViewById(R.id.btnTest2); } private void setClickLinear(){ btnTest1.setOnClickListener(this); btnTest2.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btnTest1: break; case R.id.btnTest2: break; } } private void showButton1(){ btnTest1.setVisibility(View.VISIBLE); } private void hiddenButton1(){ btnTest2.setVisibility(View.GONE); } private void showButton2(){ btnTest2.setVisibility(View.VISIBLE); } private void hiddenButton2(){ btnTest2.setVisibility(View.GONE); } }
你能见到在这里段编码里边,我只是要想简易的完成:点一下按键1的情况下掩藏按键2,点一下按键2的情况下掩藏按键1;实际上逻辑性是非常简单的,大家只必须分离界定好四个方式就可以了。可是如果我现在倘若该activity里边也有别的要求:1.我要网页页面一运行的情况下就要求4张广告图;2.正中间有一个gradview想要你去添充9宫格;3.必须依据客户种类表明不一样的等级內容;那样一想得话,大家有可能就逐渐依照必须啪啪在Activity里边界定好有关的方式,随后再再加上一个AsyncTask用以后台管理http要求,没有错它是常见的逻辑思维。可是大家如今好好来剖析一下便会发觉,Activity里边沉积的物品太多了,有哪些方法可以给它减肥呢?这个时候就到MVP隆重登场了。请看下面的编码:
public interface ITestMVP { void showButton1(); void showButton2(); void hiddenButton1(); void hiddenButton2(); }
最先大家界定一个插口,用以出示Activity里边所必须采用的方式协议书。随后大家必须在该Activity完成这一插口,类界定以下:
public class MyTestActivity extends Activity implements View.OnClickListener,ITestMVP { @Override public void showButton1() { } @Override public void showButton2() { } @Override public void hiddenButton1() { } @Override public void hiddenButton2() { } }
能够见到大家这个时候就应当在Activity里边重写如上四个方式,最后一步就应当将Presenter界定出去。实际上Presenter的最关键的功效便是分离出来Activity UI层的实际操作和后台管理编码的耦合度。可以看Presenter编码:
public class TestMvpPresenter { private ITestMVP iTestMVP; public TestMvpPresenter(ITestMVP iTestMVP) { this.iTestMVP = iTestMVP; } public void Button1Click(){ iTestMVP.showButton1(); iTestMVP.hiddenButton2(); } public void Button2Click(){ iTestMVP.showButton2(); iTestMVP.hiddenButton1(); } }
这个时候你能发觉,实际上全部的有关实际操作大家都早已提炼出到Presenter里边。那样的话,我也不但将UI和Model分离了,另外如果有别的有关的实际操作,大家还能够界定别的的Adapter。进而根据Presenter黏合好几个解决逻辑性的作用。另外如果我们在好几个网页页面中间是同样的解决逻辑性得话,那麼就认为我们可以同用同一个Presenter。是否非常简单呢?最终使我们讨论一下,在Activity的onCreate方式里边启用的编码:
TestMvpPresenter testMvpPresenter=new TestMvpPresenter(this);
好啦,今日就到这吧!若有不对,热烈欢迎拍砖。