MVC
- mvc 定义
model view controler 模型 视图 控制器 ,是一种软件的设计典范, 业务逻辑,数据,界面显示分离的 方法 组织代码,然后可以将业务逻辑 聚集到一块。
1.M: 业务逻辑处理
2.V: 处理数据显示的部分
3.C: Activity 处理用户交互问题
mvc 便于 UI 界面的显示 和业务逻辑的分离。
MVC的特点:耦合性低,可扩展性好
Activity 是 controler 起到 桥梁的作用,通过接口通信/
数据model 里拿数据, 比如 model 里面 getdata() , getdata() 方法里面网络请求等成功之后,又 根据不同的 情况走某个接口,该接口 走到 act 中
而这个model 里面也是 implement 了一个接口,除了getdata(),可以加入更多的 getX().
MVP
对于MVC呢
由于Android 端 的 view 层 是xml布局文件,不像在 java web 那样,view 层功能的强大,能做的事情非常有限,
而 controler 对应的 activity,而activity 又不得不操作一些view,而这些 操作本该是view 层做的事情,所以 controler 层显得非常冗余,为改善这一点提出了 MVP.
M : 依然是业务逻辑和实体模型
V :对应于Activity,负责 View 的绘制以及用户的交互
P :负责 完成 View 与 Model 间的交互
如图就是 在MVP 中,model 层不会直接与 View 层交互, 而是通过Presenter 中介进行交互,也正因为 android中,view层很重要,只能在主线程中操作UI,经常是不可以做耗时操作什么的,mvp 把 view 层跟数据层切断 是非常非常合理的。从代码上一开始的定位就 是对性能好一点。
例子:
/bean/ 目录下 User ,代表model 层
/presenter/ 目录下 UserLoginPresenter ,代表presenter 层
/view/ 目录下 识图层 ,view 层 IUserLoginView
脑袋里开始过这样的设计。
User.java 就是一些 username,password 的 get(), set()
然后实现一个接口,
public interface IUserBiz {
void login(String username , String password ,OnLoginListener listener);
}
以及他的实现方法:
UserBiz implement IUserBiz {
@Override
public void login ( String usrename ,String password, OnLoginListener listener){
}
}
然后就是view 层,对应activity ,实现也是一个接口,
public interfac IUserLoginView{
String getUserName():
String getPassWord();
void clearUserName();
void clearPassword();
void showLoading();
void hideLoading();
void showError();
}
Activity 中 implement 这个接口
在act 中声明一个 presenter
然后就是 presenter:
public class UserLoginPresenter {
public UserLoginPresenter(IUserLoginView userloginView){
this.userLoginView = userLoginView;
this.userBiz = new UserBiz();
}
public void login() {
//通过userBIz.login( userloginView.getUserName() ----- 等等)
}
}
MVVM
MVVM 其实跟 MVP 很类似的,主要是用数据绑定跟依赖 打造一个更高效的架构。
1:View:对应与 Activity 和XML,负责View 的绘制以及与用户交互, 做的其实就是UI相关的工作,view 层不做和业务相关的事,更新UI 也通过数据绑定来完成,业务尽量在viewmodel 层去做,把Activity 中的业务逻辑 移到viewmodel 层去 做,而Activity 要做的事就是 去初始化控件啊,属性之类的,而View 层提供更新UI的接口,但是不提倡把所有的 UI元素 都通过数据绑定来更新UI,View 层还可以做绑定事件等等。负责绘制UI,和用户操作,但是不处理业务。 最重要的一点就是View 层不做任何与业务逻辑有关的操作
2:Model : 实体模型 除了数据bean,还提供接口 供 第三个层,viewmodel 层用。数据的存储,获取,变化,都由他完成。
3: ViewModel :负责完成View 与model 间的交互,负责业务逻辑。他不会持有任何控件的引用,持有引用的任务 都挪在view 层区完成了,这就不不像MVP 中的 presenter 需要一个view 的引用接口的。
ViewModel 层 和View 层的交互是通过DataBInding 做的。
总结
mvc -- controler 层 的 act ,view 的 xml 太弱了,一大部分操作其实 都由 act 完成,所以 c 太 冗余了
mvp --- view -->actvity , 让 presenter 层做业务逻辑,presenter 持有的是view 的接口,操作接口,而不是直接操作view,这样就把识图操作和 业务逻辑解耦,从而让 activity 成为真正的view 层
mvvm -- view 层, viewmodel 层,model 层, view 层不能做任何业务操作, 而 viewmodel 层却只能做 业务操作。