服务器建立网站,建网站做seo,seo运营培训,域名网站建设方案书MVC#xff0c;MVP和MVVM是软件比较常用的三种软件架构#xff0c;这三种架构的目的都是分离#xff0c;避免将过多的逻辑全部堆积在一个类中。在Android中#xff0c;Activity中既有UI的相关处理逻辑#xff0c;又有数据获取逻辑#xff0c;从而导致Activity逻辑复杂不单…MVCMVP和MVVM是软件比较常用的三种软件架构这三种架构的目的都是分离避免将过多的逻辑全部堆积在一个类中。在Android中Activity中既有UI的相关处理逻辑又有数据获取逻辑从而导致Activity逻辑复杂不单一难以维护。为了一个应用可以更好的维护和扩展我们需要很好的区分相关层级要不然以后将数据获取方式从数据库变为网络获取时我们需要去修改整个Activity。架构使得View和数据相互独立我们把应用分成三个不同层级这样我们就能够单独测试相关层级使用架构能够把大多数逻辑从Activity中移除方便进行单元测试。MVC是什么MVC是模型(Model)视图(View)控制器(Controller)的缩写用一种业务逻辑、数据、界面显示分离的方法组织代码。其实Android Studio创建一个项目的模式就是一个简化的mvc模式。Android中的MVC含义Model实体类(数据的获取、存储、数据状态变化)。View布局文件ControllerActivity(处理数据、业务和UI)。工作原理View接受用户的交互请求。View将请求转交给Controller。Controller操作Model进行数据更新。数据更新之后Model通知View数据变化。View显示更新之后的数据。MVC的缺点随着界面及其逻辑的复杂度不断提升Activity类的职责不断增加以致变得庞大臃肿。为了解决MVC的缺点MVP 框架被提出来。MVP是什么MVP是MVC架构的一个演化版全称是Model-View-Presenter。将MVC中的V和C结合生成MVP中的V引入新的伙伴Presenter。Android中的MVP含义Model实体类(数据的获取、存储、数据状态变化)。View布局文件Activity。Presenter中介负责完成View与Model间的交互和业务逻辑。工作原理View 接收用户交互请求View 将请求转交给 Presenter(V调用P接口)Presenter 操作Model进行数据更新(P调用M接口)Model 通知Presenter数据发生变化(M调用P接口)Presenter 更新View数据(P执行接口,V相应回调)MVP的优点复杂的逻辑处理放在Presenter进行处理减少了Activity的臃肿。解耦。Model层与View层完全分离修改V层不会影响M层降低了耦合性。可以将一个Presenter用于多个视图而不需要改变Presenter的逻辑。Presenter层与View层的交互是通过接口来进行的便于单元测试。MVP的缺点维护困难。Presenter中除了业务逻辑以外还有大量的View-ModelModel-View的手动同步逻辑造成Presenter比较笨重维护起来会比较困难。MVVM是什么是 Model-View-ViewModel 的简写。MVVM与MVP的结构还是很相似的就是将Presenter升级为ViewModel。在MVVM中View层和Model层进行了双向绑定(即Data Binding)所以Model数据的更改会表现在View上反之亦然。ViewModel就是用来根据具体情况处理View或Model的变化。Android中的MVVM含义Model实体类(数据的获取、存储、数据状态变化)。View布局文件Activity。ViewModel 关联层将Model和View进行绑定Model或View更改时实时刷新对方。工作原理View 接收用户交互请求View 将请求转交给ViewModelViewModel 操作Model数据更新Model 更新完数据通知ViewModel数据发生变化ViewModel 更新View数据View/Model的变动只要改其中一方另一方都能够及时更新到MVVM的优点1.提高可维护性。Data Binding可以实现双向的交互使得视图和控制层之间的耦合程度进一步降低分离更为彻底同时减轻了Activity的压力。2.简化测试。因为同步逻辑是交由Binder做的View跟着Model同时变更所以只需要保证Model的正确性View就正确。大大减少了对View同步更新的测试。3.ViewModle易于单元测试。MVVM的缺点1.对于简单的项目使用MVVM有点大材小用。2.对于过大的项目数据绑定会导致内存开销大影响性能。3.ViewModel和View的绑定使页面异常追踪变得不方便。有可能是View出错也有可能是ViewModel的业务逻辑有问题也有可能是Model的数据出错。MVP和MVC的最大区别在MVP中View并不直接使用Model它们之间的通信是通过Presenter 来进行的所有的交互都发生在Presenter内部而在MVC中View直接从Model中读取数据而不是通过 Controller。如何选取框架本来是要每个模式写一个适用场景最后想想每个人都有自己的理解别被他人束缚了。一句话适合自己的才是最好的实例就这么一个界面咱通过MVC、MVP、MVVM分别搭建一下。MVC实例代码结构1.在layout创建一个布局文件 !--缩减版--LinearLayout...EditTextandroid:idid/et_account...//LinearLayoutLinearLayout...EditTextandroid:idid/et_password...//LinearLayoutButtonandroid:idid/btn_login.../Buttonandroid:idid/btn_back.../2.实体类(User)public class User {private String name;private String password;public User() {}//set or get ...public User(String name, String password) {this.name name;this.password password;}
}3.MVCLoginActivity//用户点击事件
mvcBinding.mcvLogin.btnLogin.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {user.setName(mvcBinding.mcvLogin.etAccount.getText().toString());user.setPassword(mvcBinding.mcvLogin.etPassword.getText().toString());login(user);}
});
//逻辑处理
private void login(User user){if(!user.getName().isEmpty()!user.getPassword().isEmpty()){if(user.getName().equals(scc001)user.getPassword().equals(111111)){Toast.makeText(this,登录成功,Toast.LENGTH_SHORT).show();}else{Toast.makeText(this,登录失败,Toast.LENGTH_SHORT).show();}}else {Toast.makeText(this,登录失败,Toast.LENGTH_SHORT).show();}}MVP实例代码结构1.Model层实体类bean同MVC中的User类就不贴代码浪费大家时间了。Model层所要执行的业务逻辑/*** 功能接口表示Model层所要执行的业务逻辑*/
public interface LoginModel {//User实体类OnLoginFinishedListener presenter业务逻辑的返回结果void login(User user, OnLoginFinishedListener listener);
}实现类(实现LoginModel接口)/*** 功能实现Model层逻辑*/
public class LoginModelImpl implements LoginModel {//第4步验证帐号密码Overridepublic void login(User user, OnLoginFinishedListener listener) {if(user.getName().isEmpty()||!user.getName().equals(scc001)){//第5步Model层里面回调Presenter层listenerlistener.onUserNameError();}else if(user.getPassword().isEmpty()||!user.getPassword().equals(111111)){//第5步Model层里面回调Presenter层listenerlistener.onPasswordError();}else {//第5步Model层里面回调Presenter层listenerlistener.onSuccess();}}
}2.Presenter层当Model层得到请求的结果回调Presenter层让Presenter层调用View层的接口方法。/*** 功能当Model层得到请求的结果回调Presenter层让Presenter层调用View层的接口方法。*/
public interface OnLoginFinishedListener {void onUserNameError();void onPasswordError();void onSuccess();
}完成登录的验证以及销毁当前View。/*** 功能登录的Presenter的接口实现类为LoginPresenterImpl* 完成登录的验证以及销毁当前View。*/
public interface LoginPresenter {//完成登录的验证void verifyData(User user);//销毁当前Viewvoid onDestroy();
}Presenter实现类引入 LoginModel(model)和LoginView(view)的引用/*** 功能实现类引入 LoginModel(model)和LoginView(view)的引用*/
public class LoginPresenterImpl implements OnLoginFinishedListener, LoginPresenter {//View层接口private LoginView loginView;//Model层接口private LoginModel loginModel;public LoginPresenterImpl(LoginView loginView) {this.loginView loginView;this.loginModel new LoginModelImpl();}//第6步通过OnLoginFinishedListener验证结果回传到Presenter层Overridepublic void onUserNameError() {if (loginView ! null) {//第7步通过loginView回传到View层loginView.setUserNameError();loginView.hideProgress();}}//第6步通过OnLoginFinishedListener验证结果回传到Presenter层Overridepublic void onPasswordError() {if (loginView ! null) {//第7步通过loginView回传到View层loginView.setPasswordError();loginView.hideProgress();}}//第6步通过OnLoginFinishedListener验证结果回传到Presenter层Overridepublic void onSuccess() {if (loginView ! null) {//第7步通过loginView回传到View层loginView.success();loginView.hideProgress();}}Overridepublic void verifyData(User user) {if (loginView ! null) {loginView.showProgress();}//第3步调用model层LoginModel接口的login()方法loginModel.login(user,this);}Overridepublic void onDestroy() {loginView null;}
}3.View层布局文件同MVC中的View层就不贴代码浪费大家时间了。Presenter与View交互是通过接口。/*** 功能Presenter与View交互是通过接口。* 接口中方法的定义是根据Activity用户交互需要展示的控件确定的。*/
public interface LoginView {//login是个耗时操作,加载中(一般用ProgressBar)void showProgress();//加载完成void hideProgress();//login账号失败给出提示void setUserNameError();//login密码失败给出提示void setPasswordError();//login成功void success();
}MVPLoginActivity/*** 功能需要实现LoginView接口。*/
public class MVPLoginActivity extends AppCompatActivity implements LoginView {LoginPresenterImpl loginPresenterImpl;Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {...//创建一个Presenter对象loginPresenterImpl new LoginPresenterImpl(MVPLoginActivity.this);//第1步用户点击登录mvpBinding.mvpLogin.btnLogin.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {User user new User();user.setName(mvpBinding.mvpLogin.etAccount.getText().toString());user.setPassword(mvpBinding.mvpLogin.etPassword.getText().toString());//第2步调用Presenter接口中的验证方法loginPresenterImpl.verifyData(user);}});}Overridepublic void showProgress() {//加载中}Overridepublic void hideProgress() {//加载完成}Overridepublic void setUserNameError() {//第7步通过loginView回传到View层//账号错误Toast.makeText(this,登录失败,Toast.LENGTH_SHORT).show();}Overridepublic void setPasswordError() {//第7步通过loginView回传到View层//密码错误Toast.makeText(this,登录失败,Toast.LENGTH_SHORT).show();}Overridepublic void success() {//第7步通过loginView回传到View层Toast.makeText(this,登录成功,Toast.LENGTH_SHORT).show();//登录成功}Overrideprotected void onDestroy() {super.onDestroy();loginPresenterImpl.onDestroy();}
}MVVM实例1.Model层实体类bean同MVC中的User类就不贴代码浪费大家时间了。2.ViewModel层ViewModel类继承自ViewModelpublic class LoginViewModel extends ViewModel {public ViewDataBinding binding;public LoginViewModel(ViewDataBinding binding){this.binding binding;}public void getUser(String userName, String password, Callback callback) {//逻辑处理User user new User();user.setPassword(111111);if(userName.isEmpty()||!userName.equals(scc001)){user.setName(scc005);}else if(password.isEmpty()||!password.equals(111111)){user.setName(scc004);}else {user.setName(scc003);}callback.onCallBack(user);}
}
ViewModel与View交互/*** 功能ViewModel与View交互。*/
public interface CallbackT {void onCallBack(T t);
}3.View层先看布局文件布局文件使用了DataBinding。?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androiddata!--为引入的类从新起一个变量名方便下面使用--variablenameusertypecom.scc.architecture.mvvm.model.User //data!--删减版--LinearLayout...LinearLayout...EditTextandroid:idid/et_account...android:text{user.name} //LinearLayoutLinearLayout...EditTextandroid:idid/et_password...android:text{user.password} //LinearLayoutButtonandroid:idid/btn_login...//LinearLayout
/layout本来Button点击事件也想用databinding去做后来觉得这个是MVP模式就忽略了这个知识点感兴趣的可以自己捣鼓一下databinding还是挺好玩的。MVVMLoginActivitypublic class MVVMLoginActivity extends AppCompatActivity {private LoginViewModel loginVM;ActivityMvvmBinding mvvmBinding;private EditText et_account,et_password;private Button btn_login,btn_back;private TextView tv_title;Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);mvvmBinding DataBindingUtil.setContentView(this, R.layout.activity_mvvm);et_account findViewById(R.id.et_account);et_password findViewById(R.id.et_password);btn_login findViewById(R.id.btn_login);tv_title findViewById(R.id.tv_title);tv_title.setText(MVVM);loginVM new LoginViewModel(mvvmBinding);User user new User( scc001, 111111);mvvmBinding.setUser(user);//设置et_accountscc001|et_password111111//第1步用户点击登录btn_login.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {login(et_account.getText().toString(),et_password.getText().toString());}});}private void login(String name,String password) {loginVM.getUser(name,password, new CallbackUser() {Overridepublic void onCallBack(User user) {mvvmBinding.setUser(user);//同步设置控件}});}
}写到这里MVC、MCP、MVVM和实例基本写完了但是感觉自己理解的不是很好有大佬能指点就更好了。最后希望对你有借鉴意义。Android知识点 Android开发核心知识点笔记Android Framework知识点笔记