欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中mvp模式使用实例详解

程序员文章站 2022-07-18 12:20:43
mvp 是从经典的模式mvc演变而来,它们的基本思想有相通的地方:controller/presenter负责逻辑的处理,model提供数据,view负 责显示。作为一种新...

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模式使用实例详解,希望对大家有所帮助