解析MVC 和 MCP

GUI  Graphical User Interface

MVC  Model-View-Controller
    ListView身上体现的 MVC 思想
    Model数据模型   数据集合 Arraylist
   View  显示          Listview
   Controller 控制    adapter

  此外 ListView  的源码实现中还是用了观察者设计模式   其中的玄机就在这个方法中

mAdapter.notifyDataSetChanged();


MVP  Modle-View-Presenter
   主要是为了让应用程序分层,提高测试效率。
    主要目标是让显示逻辑和业务逻辑分离
   将各视图中的业务逻辑从中分离出来,放到相应的类中,
   MVP中Presenter充当视图和业务逻辑的缓冲层
    
    
MVP好处
   1.模型和视图完全分离,我们可以修改视图而不影响模型
   2.我们可以将一个Presenter用于多个视图,而不需要改变
      Presenter的业务逻辑。 因为视图要比模型变化的频繁
   3.把逻辑放在Presenter中,那么就可以脱离用户接口,
      只对业务逻辑进行单元测试。
    
    1.单元测试2.让改动频繁的GUI和Model解耦和 3.Model代码复用高
    
所谓的mvp:
    model-处理业务逻辑业务逻辑包括 主要是数据读写,或者与后台通信(其实也是读写数据)
   view-处理ui控件,
   presenter-主导器,操作model和view

站在 C 语言的角度看, 这里对 java 的接口的使用 就好比C语言的 头文件一样,#include<头文件>  那么这个源文件就可以使用头文件中的函数,java类实现了某一个接口, 那么这个类就可以转换成接口在别的地方使用。

MVP 代码结构实例:


MODEL:

public interface Iconnectivity {

          boolean isOnline();
}

public class Connectivity implements Iconnectivity {

       @Override
       public boolean isOnline() {
             return readFromNetWork();

       }

       private boolean readFromNetWork(){
             //... 经过一些业务逻辑后
             return false; // 返回相应结果
       }

}

model 向外抛出接口, Connectivity 的实现接口, 这样 Connectivity对象就可以用Iconnectivity来面对外界了, 类似于C语言的头文件。 

使用方法  Iconnectivity mConn = newConnectivity();  java 多态, 父类引用子类实现对象。
题外话:  面向对象的核心重要思想-多态
多态的意思:
  实物存在的多种形态
多态的前题:
  1.要存在继承或实现关系   --  Connectivity 实现了接口Iconnectivity
  2.要有方法的重写                 --  Connectivity 重写方法 boolean isOnline();
  3.要有父类应用指向子类对象 --  Iconnectivity mConn = newConnectivity(); 
言归正传

VIEW:

public class SplashActivity extends AppCompatActivity implements ISplash {

              private SplashPresenter mSp;
              private TextView textView;

              protected void onCreate(Bundle savedInstanceState) {
                            super.onCreate(savedInstanceState);
                            setContentView(R.layout.activity_main);
                            //...初始化
                            textView = ((TextView) findViewById(R.id.textView));
                            mSp = new SplashPresenter(this);
                            mSp.checkConnectivity();
              }

              @Override
              public void hiddenProgressBar() {
                           textView.setVisibility(View.GONE);
              }

              @Override
              public void showProgressBar() {

                           textView.setVisibility(View.VISIBLE);
              }

              @Override
              public void setError() {

              }

              @Override
              public void jumpToMainActivity() {

              }

}

public interface ISplash {

              void hiddenProgressBar();

              void showProgressBar();

              void setError();

              void jumpToMainActivity();
}

同样 view 向外抛出接口
 view 中保存着一个 Presenter 的对象 mSp
 这样view就可以使用这个对象来间接的操控自己:
SplashActivity 实现接口 ISplash, 表示向外抛出隐藏,显示进度条等功能,
SplashPresenter 就可以使用这个接口来操控View

PRESENTER:

public class SplashPresenter {

          Iconnectivity mConn;
          ISplash mSplash;

          public SplashPresenter(ISplash s) {

                    this.mSplash = s;
                    mConn = new Connectivity();
          }



          public void checkConnectivity() {

                    if (mConn.isOnline()) {
                              mSplash.hiddenProgressBar();
                              mSplash.jumpToMainActivity();
                    } else {
                              mSplash.showProgressBar();
                              mSplash.setError();
                    }

          }

}

SplashPresenter:
中同时保存着 Moele 和 View 的接口, 这样, Presenter就可以根据 mode的数据来操作view
实现主持人的业务逻辑角色
    

你可能感兴趣的:(解析MVC 和 MCP)