GUI Graphical User Interface
MVC Model-View-Controller
ListView身上体现的 MVC 思想
Model数据模型 数据集合 Arraylist
View 显示 Listview
Controller 控制 adapter
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 向外抛出接口, Connectivity 的实现接口, 这样 Connectivity对象就可以用Iconnectivity来面对外界了, 类似于C语言的头文件。
使用方法 Iconnectivity mConn = newConnectivity(); java 多态, 父类引用子类实现对象。
题外话: 面向对象的核心重要思想-多态
多态的意思:
实物存在的多种形态
多态的前题:
1.要存在继承或实现关系 -- Connectivity 实现了接口Iconnectivity
2.要有方法的重写 -- Connectivity 重写方法 boolean isOnline();
3.要有父类应用指向子类对象 -- Iconnectivity mConn = newConnectivity();
言归正传
同样 view 向外抛出接口
view 中保存着一个 Presenter 的对象 mSp
这样view就可以使用这个对象来间接的操控自己:
SplashActivity 实现接口 ISplash, 表示向外抛出隐藏,显示进度条等功能,
SplashPresenter 就可以使用这个接口来操控View
SplashPresenter:
中同时保存着 Moele 和 View 的接口, 这样, Presenter就可以根据 mode的数据来操作view
实现主持人的业务逻辑角色
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
实现主持人的业务逻辑角色