欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android MVP系列(三)之MVC中篇

程序员文章站 2022-05-12 20:17:45
...

       如果没有看我上一篇文章,可以先看看Android MVP系列(二)之MVC结构,看完之后再来看这篇,不然可能会一头雾水。

闲话少说,我们进入正题:

回顾上一篇文章

可能已经忘记之前的MVC中的M层、V层、C层他们各自的职责是什么了,我们再次梳理一下,加深印象:
1.✎Module层职责

Module层数据模型层,对业务逻辑的处理,数据库、网络、算法等。

✎View层职责

1.呈现M层的数据
2.主动询问或者被动监听(例如:下拉刷新列表主动询问)
3.通知C层处理
4.接收C层,改变UI

✎Controller层职责

接收V层的操控,并转调给M层来改变V层UI或者状态

上一篇文章只是将MVC分成了3个片段,也就是M、V、C三个层,每个层都有各自的职责所在,那么这篇文章就是将M、V、C三个层给组装起来,让我们来看看完整的MVC的框架倒是是么设计的。

这个图应该都还记得吧:
Android MVP系列(三)之MVC中篇
那我们就看着这张图,然后把上一章的3个片段,组装起来合并成一个完整的MVC框架。
在Android中到底怎么去组装起来呢?

第一步

我们先创建一个MainActivity:

public class MainActivity extends AppCompatActivity {
   @Override
   public void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
   }
}

昨天我们写的Module层

/**这是一个Model**/
public class Module{
//从服务器请求获取新闻列表数据
void getNewsData() {}
//保存新闻列表到内存中
void saveCacheNews(Lis<NewsBean> dataList){}
//从内存缓存获取数据
NewsBean getNewsCache() {}
}

View层:

//当列表初始化后,告诉控制器该加载数据了
void viewInit() {
controller.loadNewsList();
}
/**更新列表**/
void updateView() {
//主动请求Model获取数据
NewsBean data = module.getNewsCache();
//更新ui
list.update(data);
//隐藏loading界面
this.hideLoading()
}
//显示loading
void showLoading(){
   list.showLoading();
}
//加载好数据后隐藏loading
void hideLoading(){
   list.hideLoading();
 }
}

Controller层:

/**这是一个Contorller**/
public class Controller {
  void loadNewsList() {
    if(module.getNewsCache() == null){
        //执行Modle
        module.getNewsData();
        //执行View
        view.showLoading();
    }
 }
}

       大家可以看出来,现在有四个类:MainActivity、Module,View,Controller我们需要合并两个,这里有两种主流,一种是选择View、另一种是选择Controller和MainActivity合并,那就按照我个人习惯来说,是按照View和Activity合并,因为MainActivity中本身就包含了布局文件(另一种则是Controller和MainActivity合并,主要就是体现在Activity中有生命周期,便于管理、控制业务流程)。还有值得一提的就是,可能就有人会问这两种方式,哪一种方式更加的好?说实话这个我确实不知道,但是我的认为是从个人习惯的思维方式去选择,我感觉是最好的。

第二步

       我们怎么把View和MainActivity合并起来呢?毫无疑问的我们第一反应肯定是interface接口,什么是接口?接口是怎么使用?这些我都不讲了,这个是java最基础的了,如果不是清楚的可以自行查阅资料。那么来看看我们代码应该怎么写:

public interface IView{
/**刷新列表**/
void updateView();

/**显示加载动画**/
void showLoading();

/**隐藏加载动画**/
void hideLoading();
}

我们让MainActivity去实现IView接口:

public class MainActivity extends AppCompatActivity implments IView{
   @Override
   public void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

   }
   @Override
   public void updateView(){

   }
   @Override
   public void showLoading(){

   }
   @Override
   public void hideLoading(){

   }
}

这样就可以看出我们的View层就和MainActivity合并起来,这样我们MainActivity就表示View层了。

第三步

我们通过这张图
Android MVP系列(三)之MVC中篇
       现在我们的Module层、View层、Controller层都有了之后,我们就通过上面的这张关系图来将M、V、C拼装组合起来,就是一个完整的MVC框架了。
不着急,我们先梳理下这个关系,再来拼装:

1.View->Controller 2.Controller -> Module 3.Module->View 4.View->Module , 这其中还有个Controller->View

跟着这个关系我们来完成这几个模块的拼装。

View层

public class MainActivity extends AppCompatActivity implments IView{
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //初始化Controller,this就是View,通过构造器注入
  Controller controller = new Controller(this);

  //初始化Model,Model -> View and View -> Model
  Module model = new Module(this);
  //module注入到Controller
  controller.setModule(module);
  //Controller -> Model
  //model.setController(controller);
  //初始化,让Controller转调Module请求数据
  controller.loadNewsList();
}
 @Override
 public void updateView(){
 //主动请求Model获取数据
 NewsBean data = module.getNewsCache();
 //更新ui
 list.update(data);
 //隐藏loading界面
 this.hideLoading()
 }
 @Override
 public void showLoading(){
 list.showLoading()
 }
 @Override
 public void hideLoading(){
 list.hideLoading
 }
}

Controller层:

/**这是一个Contorller**/
public class Controller {
private IView view;
private Module module;
 //构造方法注入View
 public void Controller(IView view){
 this.view=view;
 }
 //注入Module
 public void Controller(Module module){
 this.module=module;
 }
 //转调Module加载数据
 void loadNewsList() {
   if(module.getNewsCache() == null){
       //执行Modle
       module.getNewsData();
       //执行View开始加载数据了,显示加载动画
       view.showLoading();
   }
 }
}

Module层

/**这是一个Model**/
public class Module{
 private IView view;
 //构造方法传入View
 public void Module(IView view){
 this.view=view;
 }
 //从服务器请求获取新闻列表数据
 void getNewsData() {
 //耗时获取数据
 ...
 //将服务器返回的List<NewsBean>集合dataList保存到本地
 this.saveCacheNews(dataList);
 }
 //保存新闻列表到内存中
 void saveCacheNews(Lis<NewsBean> dataList){
 //保存到本地
 ...
 //通知View更新数据了
 view.updateView();
 }
 //从内存缓存获取数据
 NewsBean getNewsCache() {
 //内存中去获取数据 datas
 ...
  return datas;
 }
}

       好了,至此我们的MVC的框架就大功告成了,严谨一点说,应该是对于这种需求下的MVC框架就搭建好了。不知道大家有没有清楚明白,如果还有什么不明白的地方,可以加我的微信号:13982250340,备注下,给你讲解清楚。

       我相信大家看我的标题应该知道,还有下篇才对。对的还有下篇,那么框架都搭建完了,还有什么可以写的呢?我相信细心的朋友可以看到我在View层也就是MainActivity中注释了一行代码:model.setController(controller);这段代码是被我注释了的,为什么注释了呢?我们可以看到我们当前的设计的框架怎么感觉都提现不出来它的优势在什么地方,还感觉比较死板,没啥扩展性,虽然层次分明,总感觉哪里怪怪的。

       别急,下一章我们就将MVC的优势给体现出来,缺点也指出来,同时和MVP的模式做出对比,指出MVP的特点。

原创不易,如果觉得写得好,扫码关注一下点个赞,是我最大的动力。


关注我,一定会有意想不到的东西等着你:
每天专注分享Android、JAVA干货

Android MVP系列(三)之MVC中篇
备注:程序圈LT
微信扫一扫
关注该公众号

相关标签: Android MVP MVP