Android中mvp模式使用实例详解
mvp 是从经典的模式mvc演变而来,它们的基本思想有相通的地方:controller/presenter负责逻辑的处理,model提供数据,view负 责显示。作为一种新的模式,mvp与mvc有着一个重大的区别:在mvp中view并不直接使用model,它们之间的通信是通过presenter (mvc中的controller)来进行的,所有的交互都发生在presenter内部,而在mvc中view会从直接model中读取数据而不是通过 controller。
在mvc里,view是可以直接访问model的!从而,view里会包含model信息,不可避免的还要包括一些业务逻辑。 在mvc模型里,更关注的model的不变,而同时有多个对model的不同显示,及view。所以,在mvc模型里,model不依赖于view,但是 view是依赖于model的。不仅如此,因为有一些业务逻辑在view里实现了,导致要更改view也是比较困难的,至少那些业务逻辑是无法重用的。
mvp如何解决mvc的问题?
在mvp里,presenter完全把model和view进行了分离,主要的程序逻辑在presenter里实现。而且,presenter与具 体的view是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更view时候可以保持presenter的不变,即重用! 不仅如此,我们还可以编写测试用的view,模拟用户的各种操作,从而实现对presenter的测试—而不需要使用自动化的测试工具。 我们甚至可以在model和view都没有完成时候,就可以通过编写mock object(即实现了model和view的接口,但没有具体的内容的)来测试presenter的逻辑。 在mvp里,应用程序的逻辑主要在presenter来实现,其中的view是很薄的一层。因此就有人提出了presenter first的设计模式,就是根据user story来首先设计和开发presenter。在这个过程中,view是很简单的,能够把信息显示清楚就可以了。在后面,根据需要再随便更改view, 而对presenter没有任何的影响了。 如果要实现的ui比较复杂,而且相关的显示逻辑还跟model有关系,就可以在view和presenter之间放置一个adapter。由这个 adapter来访问model和view,避免两者之间的关联。而同时,因为adapter实现了view的接口,从而可以保证与presenter之 间接口的不变。这样就可以保证view和presenter之间接口的简洁,又不失去ui的灵活性。 在mvp模式里,view只应该有简单的set/get的方法,用户输入和设置界面显示的内容,除此就不应该有更多的内容,绝不容许直接访问model— 这就是与mvc很大的不同之处。
mvp的优点:
1、模型与视图完全分离,我们可以修改视图而不影响模型;
2、可以更高效地使用模型,因为所有的交互都发生在一个地方——presenter内部;
3、我们可以将一个presenter用于多个视图,而不需要改变presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁;
4、如果我们把逻辑放在presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。
使用方法
1、建立bean
public class userbean { private string mfirstname; private string mlastname; public userbean(string firstname, string lastname) { this. mfirstname = firstname; this. mlastname = lastname; } public string getfirstname() { return mfirstname; } public string getlastname() { return mlastname; } }
2、建立model接口(处理业务逻辑,这里指数据读写)
public interface iusermodel { void setid(int id); void setfirstname(string firstname); void setlastname(string lastname); int getid(); userbean load(int id);// 通过id读取user信息,返回一个userbean }
3、建立view接口(更新ui中的view状态),这里列出需要操作当前view的方法
public interface iuserview { int getid(); string getfristname(); string getlastname(); void setfirstname(string firstname); void setlastname(string lastname); }
4、建立presenter(主导器,通过iview和imodel接口操作model和view),activity可以把所有逻辑给presenter处理,这样java逻辑就从手机的activity中分离出来
public class userpresenter { private iuserview muserview; private iusermodel musermodel; public userpresenter(iuserview view) { muserview = view; musermodel = new usermodel(); } public void saveuser( int id, string firstname, string lastname) { musermodel.setid(id); musermodel.setfirstname(firstname); musermodel.setlastname(lastname); } public void loaduser( int id) { userbean user = musermodel.load(id); muserview.setfirstname(user.getfirstname()); // 通过调用iuserview的方法来更新显示 muserview.setlastname(user.getlastname()); } }
mvp主要解决就是把逻辑层抽出来成p层,要是遇到需求逻辑上的更改就可以只需要修改p层了或者遇到逻辑上的大概我们可以直接从写一个p也可以,很 多开发人员把所有的东西都写在了activity/fragment里面这样一来遇到频繁改需求或者逻辑越来越复杂的时候,activity /fragment里面就会出现过多的混杂逻辑导致出错,所以mvp模式对于app来对控制逻辑和ui的解耦来说是一个不错的选择!
以上所述是小编给大家介绍的android中mvp模式使用实例详解,希望对大家有所帮助
推荐阅读