解析MVC 和 MCP

来源:互联网 发布:毛笔字软件哪个好 编辑:程序博客网 时间:2024/05/20 22:30
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
实现主持人的业务逻辑角色
    
0 0
原创粉丝点击