
本文共 4148 字,大约阅读时间需要 13 分钟。
随着项目业务逻辑日益增多,项目变的越来越复杂,这时候选择一个合适的架构模式,能让项目维护起来更容易,可读性更强。
以前主要使用MVC模式,但是现在的越来越多的开发者开始使用MVP模式来代替MVC模式,究竟MVP模式比MVC模式好在哪里,请看一下比喻:
MVC:
饭店老板戚总就好比我们的Controller,饭店的厨师老范相当于View(买什么菜他说了算是需求的来源),采购小王相当于Model。厨师老范需要做个霸王别姬,需要一大堆食材,他把需求报告给戚总,戚总整理成清单要求小王去采购,小王采购完成后直接将食材交给厨师老范。这就是MVC的一个循环,当然饭店比较小,有的时候厨师老范只需要一根葱这时候没必要专门让采购跑一趟了吧也省点油钱,戚总顺手就买了,时间久了,戚总慢慢干了点采购的活…
MVP:
戚总有时候为了多省点油钱越来越多的担任采购的活了,甚至还兼职抄起了菜…慢慢的随着饭店的生意越来越好慢慢做大,戚总的事情越来越多开始忙不过来了,另一方面饭店的生意好了却不见得多挣了多少钱。戚总想着会不会是厨师老范和采购小王串通坑他呢,于是乎,戚总想了一夜,哎嗨,一套新的管理机制来了。
View还是厨师老范,Model是采购小王,戚总把自己定位为Presenter,以后厨师老范有需求了仍然告诉戚总,戚总安排给小王去采购,采购完之后把食材交给戚总检查,数目账单没问题了戚总再将食材给厨师老范。这样不让厨师老范和采购小王就没有任何机会沟通避免他们串通,同时戚总以后只负责吩咐两人做事也不为了省点油钱自己亲自干了毕竟生意做大了得像个老板的样子了,由此MVP模型初见雏形。
以上图片比喻摘抄至网络,说了一大堆废话开始撸代码:
代码目录结构如下:
BaseView:跟View交互接口
public interface BaseView { /* * tag用来区分多个异步操作 * */ void start(String tag); void finish(String tag,Object o); void error(String tag,Object o);}
BasePresenter:绑定view接口
public class BasePresenter<V extends BaseView> { public V view; public void bindView(V view){ this.view = view; } public void unBindView(){ this.view = null; } public boolean checkBindView(){ return view == null; }}
BaseActivity:在mvp模式中这个非必须,可以参考,主要是为了防止频繁的写bindView,统一管理
public abstract class BaseActivity<V extends BaseView,P extends BasePresenter<V>> extends AppCompatActivity { public LayoutInflater mInflater; public P presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayouResId()); mInflater = LayoutInflater.from(this); presenter = initPresenter(); presenter.bindView((V)this); init(); } protected abstract P initPresenter(); public abstract int getLayouResId(); public abstract void init(); @Override protected void onDestroy() { super.onDestroy(); //防止内存泄漏 if (presenter != null){ presenter.unBindView(); } }}
LoginView:拓展View接口
public interface LoginView extends BaseView { String getLoginName(); String getLoginPassword();}
LoginBusiness:登录业务接口
public interface LoginBusiness { void doLogin();}
LoginPresenter:业务接口具体实现
public class LoginPresenter extends BasePresenter<LoginView> implements LoginBusiness { private static final String TAG = LoginPresenter.class.getSimpleName(); //可以在构造方法中传递一些需要的参数,比如Context之类的 public LoginPresenter(){ } @Override public void doLogin() { //开始操作 view.start(TAG); String name = view.getLoginName(); String password = view.getLoginPassword(); /*模拟访问网络耗时操作,此处网络访问还可以做进一步封装成Model, presenter从Model获取数据,这里只做简单演示*/ new Handler().postDelayed(new Runnable() { @Override public void run() { //完成 view.finish(TAG,"login success"); //出错误 //view.error(TAG,""); } },2000); }}
最后是ManActivity
public class MainActivity extends BaseActivity<LoginView,LoginPresenter> implements LoginView { private static final String TAG = MainActivity.class.getSimpleName(); private Button btn; @Override public void init() { btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { presenter.doLogin(); } }); } @Override public int getLayouResId() { return R.layout.activity_main; } @Override protected LoginPresenter initPresenter() { return new LoginPresenter(); } @Override public void start(String tag) { //可以做一些提示语操作 Log.e(TAG,"start"); } @Override public void finish(String tag, Object o) { Log.e(TAG,"finish , result is : "+o.toString()); } @Override public void error(String tag, Object o) { Log.e(TAG,"error , result is : "+o.toString()); } @Override public String getLoginName() { return "name";//从控件中获取 } @Override public String getLoginPassword() { return "password";//从控件中获取 }}
至此,一个简单的MVP模式架构完成,如果有误,欢迎指正。
发表评论
最新留言
关于作者
