近日,重新接触到“MVP”这个词,然后百度搜索了一遍,重新找到鸿洋大神的关于MVP的帖子:浅谈 MVP in Android,看了并对照着敲了一下,有一点自己的心得,后来晚上翻看了一下《大话设计模式》这本书,重新看一下,突然发现““策略模式”与“MVP风格”竟然有一些相同的地方,通过“MVP风格”来理解一直看不是很明白的“策略模式”,居然很好明白了,于是现在写下来,就当自己的笔记了。
首先简单介绍一下MVP风格。
MVP风格:
Model : 模型+业务逻辑,包括接口+具体实现;用接口是为了其继承性,而具体实现则是实现接口,并实现具体方法。需要实现哪些方法,根据具体的业务实现。
View : 视图,只有接口;首先根据视图拥有哪些组件,直接从组件可以获得什么信息,并根据此写方法。
Presenter : 主持人(直接翻译的,实在找不到合适的解释,英语渣,╮(╯_╰)╭),只有具体实现。参照Model和View来具体实现。
分类大概是这么个样子:
MVP风格,其实就是把“V视图”和“M业务逻辑”更好地分离开来,然后通过“P”作为中间人对V和M进行联系,而V和M不直接进行联系。
举个例子:(额。。。不举例子了,具体例子,还是看鸿洋大神的吧:再次传送门)
然后策略模式大概也是这样的思想:
例如:实现一个计算器。
1、首先抽象出一个Operate类,拥有其抽象方法getCalResult(int on1, int on2),传入参数是参与计算的操作数1和操作数2。
Operate.class
public abstract class Operate {
public abstract int getResult(int num1, int num2);
}
2、实现具体操作类OperateAdd和OperateMin,并继承Operate类,实现各自的getCalResult(int on1, on2)的具体方法。
OperateAdd.class
public class OperateAdd extends Operate {
@Override
public int getResult(int num1, int num2) {
return num1+num2;
}
}
OperateMin.class
public class OperateMinus extends Operate {
@Override
public int getResult(int num1, int num2) {
return num1-num2;
}
}
3、实现M和V的连接枢纽Presenter---OperatePresenter。
OperatePresenter.class
public class OperatePresenter {
private Operate mOperate = null;
public OperatePresenter(String strOper) { /* 根据操作符,自动选择计算方法 */
switch(strOper){
case "+":
mOperate = new OperateAdd();
break;
case "-":
mOperate = new OperateMinus();
break;
}
}
public int getCalResult(int num1, int num2){
return mOperate.getResult(num1, num2);
}
}
4、最后,在View中生成Presenter对象,并在对应位置调用getCalResult方法,并传入通过View获取到的操作数1和操作数2即可获得结果。
public class Test {
public static void main(String[] args) {
OperatePresenter mOPAdd = new OperatePresenter("+");
System.out.println("0 + 5 = "+mOPAdd.getCalResult(0, 5));
OperatePresenter mOPMin = new OperatePresenter("-");
System.out.println("10 - 3 = "+mOPMin.getCalResult(10, 3));
}
}
全文总结:MVP风格 和 策略模式 在代码风格上,都是差不多的:Model(接口/抽象:Operate,具体实现:OperateAdd,OperateMinus),View(抽象:上例没有用到),Presenter(具体实现:OperatePresenter),同样是做到了业务逻辑与界面的分离(因为在View中,只有Presenter参与到里面,而业务逻辑OperateAdd和OperateMinus,以及其父类Model都与View无关)。当然也有些许的差别,但是总的来说还是差不多的。当我看完鸿洋大神的浅谈MVP,再看策略模式的时候,通过MVP来理解策略模式,居然看懂了(之前一头雾水),因此写下这篇博客,就当做是用来记录一下,也方便自己以后看吧。偷懒了,写得不好,请见谅。