Android MVP与MVC框架模式

时间:2022-12-21 21:11:21

MVP与MVC模式

MVC在我们开发过程中比较常见,就不进行详细解释,主要看下二者的区别。
(1)MVP与MVC名称上就可以看出来,MVP中使用Presenter代替了之前的Controller,Presenter可以被我们理解为一个中间人,也是主要负责业务逻辑的处理,但是它与Controller又有不同之处。
(2)MVC规范不够明确,MVP规范更加明确,在系统扩展方面也更加灵活。
(3)其实二者最本质的区别是View与Model没有直接联系,通过下面这幅图体现出来的。
Android MVP与MVC框架模式
拿ListView来讲,以前使用MVC模式的时候通常View指的是一个Activity,但有时候Activity还被作为Controller控制器,虽然MVC模式是想将业务逻辑、数据、界面显示分离但在实际应用中这种分离并不明显,而且通过上图可以看出来,Model与View相互影响,当你的Model(数据)发生改变时可能会影响到View,二者联系还是比较多的(这就是上面所说的规范不够明确)。而在MVP中Presenter作为一个中间人联系这View与Model,当Model改变时并不影响View,如果需要进行修改,只需要在Presenter中进行,从而减少了Model与View的联系,降低了耦合度。

MVP实例

Android MVP与MVC框架模式
以ListView为例,布局跟Adapter代码不进行展示。
思路:根据MVP模式知道需要有Model、View、Presenter。首先是Model,Model中加载数据(所以demo中有load()方法)、View显示数据(所以demo中写了showview()方法)、Presenter对二者进行绑定(所以demo中有bind()方法),根据上面的MVP模式图可以看出Presenter将持有Model和View,在但在实际开发中考虑可扩展性,一般都是获得Model和View的接口。

Model

接口

public interface IFruitModel {
void loadFruits(FruitOnloadListener listener);
interface FruitOnloadListener{
void onLoadFinish(List<Fruit> fruits);
}
}

具体数据加载

public class FruitModel implements IFruitModel{

@Override
public void loadFruits(FruitOnloadListener listener) {
List<Fruit> fruits=new ArrayList<Fruit>();
fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
fruits.add(new Fruit("苹果",R.drawable.ic_btn_speak_now));
listener.onLoadFinish(fruits);

}

View

该接口将被Acivity实现

public interface IFruitView {
/**
* 显示
* @param fruits
*/

void showFruitView(List<Fruit> fruits);
}

Presenter

public class Presenter {
// 需要持有View和Model接口
private IFruitView mFruitView;
private IFruitModel mFruitModel = new FruitModel();

public Presenter(IFruitView mFruitView) {
super();
this.mFruitView = mFruitView;
}

public void bind() {
//进行数据与View的绑定,并回调showview方法,
//一般MVC中Activity担任controller,此时MVP中由Presenter回调实现。
mFruitModel.loadFruits(new IFruitModel.FruitOnloadListener() {

@Override
public void onLoadFinish(List<Fruit> fruits) {

mFruitView.showFruitView(fruits);
}
});
}

}

MainActivity

public class MainActivity extends Activity implements IFruitView {
private ListView mListView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.listview);
new Presenter(this).bind();
}

@Override
public void showFruitView(List<Fruit> fruits) {
FruitAdapter adapter = new FruitAdapter(fruits, this);
mListView.setAdapter(adapter);
}

}

这样View与Model没有直接联系。