1.简介
现在项目中采用了MVC和MVP的混合结构,我感觉MVP和MVC各有各的有点,MVC更容易入手,写的类也相对较少 ,MVP是相当于MVC的升级版 ,面向接口编程,是view和modle完全解耦,更利于项目的维护,项目结构更清晰,各自的职责更加清晰 ,但也有缺点就是要写的类更多,但总体来说MVP架构还是更好的选择
2.MVC
mvc是传统的项目架构,在Android项目中
- m : model 实体层 具体的业务实体模型
- v :view 视图层 相关布局文件 Activity和Fragment也属于视图
- c : control 控制层 只具体的业务逻辑数据,view和model之间的交互(Activity 和Fragment)
(MVC架构)
(流程图 model和view完全耦合到一起)
3.MVP
mvp是为了让view和model进行解耦,项目结构更加清晰,解放Activity
- m : model 实体层 具体的业务实体模型
- v:view 视图层 相关布局文件 Activity和Fragment
- p : presenter 代理层 负责业务逻辑的梳理 ,view和modle之间的交互
4.MVP 和MVC的区别
上图明显的概括出了mvc和mvp的不同点,就是mvp是view和modle不直接交互,两者的交互交给presenter来处理,还有一点就是prsenter和view之间的交互是通过接口交互的
5. Demo
我按照mvp的架构写了一个demo,demo是新闻列表的一个item,效果图如下
- modle
public class NewMessage {
public String title; //标题
public String content; //内容
public boolean colleciton; //收藏
public NewMessage(String title ,String content ,boolean colleciton){
this.title = title;
this.content = content;
this.colleciton = colleciton;
}
}
- 网络处理类 ,是采用面向接口的
根据页面逻辑,网络处理主要有拉取新闻信息 和点赞和取消赞的操作
public interface INetOperation {
/**
* 获取信息信息
* @param netListener
*/
public void getMessage(NetListener netListener);
/**
* 点赞取消赞
* @param collection
* @param netListener
*/
public void collectionOperation(boolean collection,NetListener netListener);
//网络回调
public abstract class NetListener{
public void doMessge(NewMessage newMessage){};
public void collectionSuccess(){};
public void collectionFail(){};
}
}
对应的实现类如下
public class NetOperation implements INetOperation{
Handler mainHandler = new Handler(Looper.getMainLooper());
@Override
public void getMessage(final NetListener netListener) {
new Thread(){
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
final NewMessage newMessage =new NewMessage("中国雄起","改革开放后中国高速发展,改革开放后中国高速发展,",true);
mainHandler.post(new Runnable() {
@Override
public void run() {
netListener.doMessge(newMessage);
}
});
}
}.start();
}
@Override
public void collectionOperation(boolean collection, final NetListener netListener) {
new Thread(){
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mainHandler.post(new Runnable() {
@Override
public void run() {
netListener.collectionSuccess();
}
});
}
}.start();
}
}
- v view
view和presenter交互是通过接口进行交互的,我们定义了一个INewMessageView的一个接口 ,但这个接口具体有什么方法呢,就需要根据具体的业务逻辑进行书写,本demo中页面处理有两处 1:设置新闻相关内容,2:更新收藏状态
public interface INewMessageView {
/**
* 设置页面新闻信息内容
* @param message
*/
void setContent(NewMessage message);
/**
* 更新收藏信息
* @param collection
*/
void setCollection(boolean collection);
}
下面看下具体的实现
public class MvpActivity extends AppCompatActivity implements View.OnClickListener , INewMessageView{
public TextView title;
public TextView content;
public ImageView colleciotn;
private MessagePresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvp);
title = findViewById(R.id.title);
content = findViewById(R.id.content);
colleciotn = findViewById(R.id.collection);
colleciotn.setOnClickListener(this);
presenter = new MessagePresenter(this);
presenter.getMessage();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.collection:
presenter.collection();
break;
}
}
@Override
public void setContent(NewMessage message) {
title.setText(message.title);
colleciotn.setSelected(message.colleciton);
content.setText(message.content);
}
@Override
public void setCollection(boolean collection) {
colleciotn.setSelected(collection);
}
}
上面可以看到具体的实现是由Activity实现的
- presenter
presenter主要用来view和model的交互的,根据本demo它该有什么方法呢 主要有两个方法,1:获取新闻信息 2:点赞取消赞操作
public class MessagePresenter {
private INewMessageView messageView;
//强求回来的数据
private NewMessage message;
private INetOperation netOperation;
public MessagePresenter(INewMessageView iNewMessageView){
this.messageView = iNewMessageView;
netOperation = new NetOperation();
}
/**
*收藏
*/
public void collection(){
if (message ==null){
return;
}
netOperation.collectionOperation(message.colleciton, new INetOperation.NetListener() {
@Override
public void collectionSuccess() {
super.collectionSuccess();
message.colleciton = !message.colleciton;
messageView.setCollection(message.colleciton);
}
@Override
public void collectionFail() {
super.collectionFail();
}
});
}
/**
* 获取新闻信息
*/
public void getMessage(){
netOperation.getMessage(new INetOperation.NetListener() {
@Override
public void doMessge(NewMessage newMessage) {
super.doMessge(newMessage);
message = newMessage;
messageView.setContent(newMessage);
}
});
}
}
代码如上,是不是比较清晰
presenter承接了页面的业务逻辑处理,负责view和model的交互,从网络上拉取数据,更新到页面上
总结
到这本片文章就结束了 ,本文参考了鸿洋大神的博客,其中有些图也是从他的博客中拉取的,第一次在掘金上写blog,写文章的脉络还不太熟悉,写的也比较慢,希望自己越来越好吧,加油