1.程序为什么要分包分层?
借用我刚才在网上看到的一个小例子:
"小饭店: 一个服务员搞定(接待顾客\点菜\炒菜)
大饭店:
迎宾员(是否有预定\询问吃中餐还是西餐或者烧烤等\几位用餐 \领路到指定的包间\找点菜员为顾客点菜 )
点菜员(记录顾客点餐内容\记录是否有忌口等问题\找厨师为顾客炒菜)
厨师(按照顾客菜肴清单,进行炒菜)"
看完了这个小例子想必就很清楚的知道使用框架模式的好处了吧.
2.MVC(Model-View-Controller)
View(视图层):这个很容易理解了,就是人机交互的那一层,再简单点就是界面.
Controller(控制层):对应的可以理解为Activity.
Model(模型层):所有业务逻辑的实现.
自己简单的写了个小demo
Controller层对事件的控制
public class MainActivity extends BaseActivity implements MainModel.MainListener {
private Button mBtn;
private TextView mTv;
private MainModel mainModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
mBtn = (Button) findViewById(R.id.btn);
mTv = (TextView) findViewById(R.id.tv);
mainModel = new MainModel(this);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mainModel.queryUserName();
}
});
}
@Override
public void getUserName(String name) {
mTv.setText(name);
}
}
Model层对业务的处理
public class MainModel {
private MainListener mListener;
public MainModel(MainListener listener) {
this.mListener = listener;
}
public void queryUserName() {
String userName = "张三";
mListener.getUserName(userName);
}
public interface MainListener {
void getUserName(String name);
}
}
View层就是XML了,这里就不贴了.
对于这样的框架模式其实如果较较真儿的话你会发现view的数据操作、事件处理都在Activity中进行,似乎MVC的分层也不是那么清晰了.而且与Model层耦合严重,Activity中的代码过多逻辑复杂,后期维护起来也很麻烦,所以MVP模式就顺理成章的出现了.
3.MVP(Model-View-Presenter)
MV与前文一样,没啥区别,只不过中间的控制层桥梁这回换成了Presenter.M层与V层是没有直接交互的,下面直接贴上一个简单的MVP模式的代码.
包结构
View层的操作
public class MainActivity extends BaseActivity implements IMainView {
MainPresenter mainPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
mainPresenter = new MainPresenter();
//View初始化时进行绑定
mainPresenter.attachView(this);
mainPresenter.login("UserName","PassWord");
}
@Override
protected void onDestroy() {
super.onDestroy();
//View销毁时进行解除
mainPresenter.detachView();
}
@Override
public void loginSuccess(String msg) {
Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}
@Override
public void loginFailure(String msg) {
Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}
}
Presenter层的操作
public class MainPresenter implements MainModel.IMainListener {
private IMainView mView;
private MainModel mModel;
public MainPresenter() {
mModel = new MainModel(this);
}
//绑定View
public void attachView(IMainView view) {
this.mView = view;
}
//解除View
public void detachView() {
this.mView = null;
}
//判断是否绑定View
public boolean isViewAttached() {
return mView != null;
}
public void login(String userName, String passWord) {
mModel.login(userName, passWord);
}
@Override
public void loginSuccess(String msg) {
if (isViewAttached()) {
mView.loginSuccess(msg);
}
}
@Override
public void loginFailure(String msg) {
if (isViewAttached()) {
mView.loginFailure(msg);
}
}
}
Model层的操作,Model层通过IMainListener与Presenter层通信
public class MainModel {
private IMainListener mListener;
public MainModel(IMainListener listener) {
mListener = listener;
}
public void login(final String userName, final String passWord) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (userName.equals("") && passWord.equals("")) {
mListener.loginSuccess("登录成功");
} else {
mListener.loginFailure("登录失败");
}
}
}, 2000);
}
public interface IMainListener {
void loginSuccess(String msg);
void loginFailure(String msg);
}
}
Presenter层通过IMainView接口与View层通信
public interface IMainView{
void loginSuccess(String msg);
void loginFailure(String msg);
}
以上就是一个简单的MVP模式实例,如果想再进一步提炼的话还可以再封装一层Base层,这里就不一一展示了.
在真实项目中使用哪种模式还要视情况而定,如果比较小的项目的话可以使用MVC模式,毕竟开发起来比较快速方便,大型的项目可以使用MVP模式,虽然MVP模式看着代码冗余,但是维护起来真的不是一般的省力气,至于MVVM模式笔者本人还没有用到,以后需要的话再与大家一起分享.以上...欢迎大家指正!