网站页面构成,东莞网络推广费用,做网站时新闻的背景图,wordpress登录才可评论MVC
MVC #xff0c;早期的开发架构#xff0c;在安卓里#xff0c;用res代表V#xff0c;activity代表Controller层#xff0c;Model层完成数据请求#xff0c;更新操作#xff0c;activity完成view的绑定#xff0c;以及业务逻辑的编写#xff0c;更新view#xf…MVC
MVC 早期的开发架构在安卓里用res代表Vactivity代表Controller层Model层完成数据请求更新操作activity完成view的绑定以及业务逻辑的编写更新view这种模式是单向的虽然代码存在分层但是之间的耦合性还是很高并且C层做的事情很多久而久之会变得臃肿。 代码实现
ViewModel static class StudentModel{private String name;private int age;public StudentModel(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}}View层 static class StudentView{public void PrintStudentData(String name ,int age){System.out.println(Student name:name age:age);}}
Controller
static class StudentController{StudentModel model;StudentView view;public StudentController(StudentModel model, StudentView view) {this.model model;this.view view;}public void setStudentName(String name){model.setName(name);}public String getStudentName(){return model.getName();}public void setStudentAge(int age){model.setAge(age);}public Integer getStudentAge(){return model.getAge();}public void updateView(StudentView view){view.PrintStudentData(model.getName(),model.getAge());}}
完整代码
package com.example.lib;public class MvcTest {public static void main(String[] args) {StudentModel student getStudentDataBase();StudentView view new StudentView();StudentController controller new StudentController(student,view);controller.updateView(view);controller.setStudentName(lisi);controller.updateView(view);}public static StudentModel getStudentDataBase(){return new StudentModel(zhangsan,18);}static class StudentModel{private String name;private int age;public StudentModel(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}}static class StudentView{public void PrintStudentData(String name ,int age){System.out.println(Student name:name age:age);}}static class StudentController{StudentModel model;StudentView view;public StudentController(StudentModel model, StudentView view) {this.model model;this.view view;}public void setStudentName(String name){model.setName(name);}public String getStudentName(){return model.getName();}public void setStudentAge(int age){model.setAge(age);}public Integer getStudentAge(){return model.getAge();}public void updateView(StudentView view){view.PrintStudentData(model.getName(),model.getAge());}}}MVP
于是出现了MVP模式这个架构模式在安卓移动端开发中比较常见将Activity和res统一作为V层Model层还是完成数据的请求和更新新建了一个类Presenter用来作为P层这样的好处是方便管理每一个Activity的业务逻辑拿到数据后通过接口回调的方式更新View层实现了双向通信。缺点是需要实现Presenter类并且需要开发接口对简单的业务逻辑比较繁琐且P层的事情还是比较臃肿 代码实现以登录事务为例
ViewModel层
相比与MVC的ViewModel,MVP的不同在于ViewModle多实现了一个IUser接口从而实现双向通信 interface IUser{void login(String name,String password,OnLoginListener listener);}interface OnLoginListener{void loginFail();void loginSuccess(User user);}static class UserModel implements IUser{Overridepublic void login(String name, String password, OnLoginListener listener) {//模拟一下登录if(name.equals(admin)password.equals(123456)){User user new User();user.setUsername(name);user.setPassword(password);listener.loginSuccess(user);}else{listener.loginFail();}}}
View层
在Android开发中MVP架构模式里View层指的是Activity和res。同理也实现了一个IUserLogin接口从而和P层实现双向通信 static class UserView implements IUserLogin{Overridepublic void showLoading() {System.out.println(正在登录...);}Overridepublic void hideLoading() {System.out.println(登录完成,获取结果);}Overridepublic void loginFail() {System.out.println(登录失败);}Overridepublic void loginSuccess(User user) {System.out.println(username: user.getUsername() 登陆成功);}}interface IUserLogin{void showLoading();void hideLoading();void loginFail();void loginSuccess(User user);}
Presenter层 static class UserPresenter {private final UserModel userModel;private final UserView userView;private final User user;public UserPresenter(UserView userView) {this.userModel new UserModel();this.userView userView;user new User(admin,123456);}void login(){userView.showLoading();userModel.login(user.getUsername(), user.getPassword(), new OnLoginListener() {Overridepublic void loginFail() {userView.hideLoading();userView.loginFail();}Overridepublic void loginSuccess(User user) {userView.hideLoading();userView.loginSuccess(user);}});}}
完整代码如下
package com.example.lib;public class MvpTest {public static void main(String[] args) {UserView loginView new UserView();UserPresenter presenter new UserPresenter(loginView);presenter.login();}static class User{String username;String password;public User() {}public User(String username, String password) {this.username username;this.password password;}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}}interface IUser{void login(String name,String password,OnLoginListener listener);}interface OnLoginListener{void loginFail();void loginSuccess(User user);}static class UserModel implements IUser{Overridepublic void login(String name, String password, OnLoginListener listener) {//模拟一下登录if(name.equals(admin)password.equals(123456)){User user new User();user.setUsername(name);user.setPassword(password);listener.loginSuccess(user);}else{listener.loginFail();}}}static class UserView implements IUserLogin{Overridepublic void showLoading() {System.out.println(正在登录...);}Overridepublic void hideLoading() {System.out.println(登录完成,获取结果);}Overridepublic void loginFail() {System.out.println(登录失败);}Overridepublic void loginSuccess(User user) {System.out.println(username: user.getUsername() 登陆成功);}}interface IUserLogin{void showLoading();void hideLoading();void loginFail();void loginSuccess(User user);}static class UserPresenter {private final UserModel userModel;private final UserView userView;private final User user;public UserPresenter(UserView userView) {this.userModel new UserModel();this.userView userView;user new User(admin,123456);}void login(){userView.showLoading();userModel.login(user.getUsername(), user.getPassword(), new OnLoginListener() {Overridepublic void loginFail() {userView.hideLoading();userView.loginFail();}Overridepublic void loginSuccess(User user) {userView.hideLoading();userView.loginSuccess(user);}});}}}MVVM
再后面就是MVVM同理Activity和res还是作为V层Model层请求数据和更新出现了一个ViewModel的层这个类的职责在于对数据进行绑定以数据驱动View层同样当视图层改变后Model层也能更新从而实现了M和V之间的双向绑定。最常用的是谷歌2015年推出的jetpack的组件DataBinding无须进行view绑定避免了空指针等很多繁琐的业务逻辑。 代码实现略用JetPack提供的databinding即可 总结 MVC,MVP,MVVM的出现都是为了视图分层使代码结构逻辑变得清晰同时实现类的单一职责降低耦合度。但是同时选用架构设计模式的时候也要根据业务类型来考虑避免出现大多繁琐的设计总之一切为了开发效率。