好久没有写博客啦,这些天在千峰的培训任务有些重,今天忙里抽闲给大家带来一个MVP的简单HelloWorld的实现,希望能给大家带来一些启发!!!
类结构图
首先,不要被这么多文件吓到啦,要实现解耦就必须得付出什么,这是无需质疑的!
接下来,让我们一个个来慢慢分析
view包
MVP中将Activity视为View,所以 视图的显示方法 全部定义在view中,在此我们抽取出一个接口MvpView,此处不用创建该接口也可以,我之所以创建该接口是为了让代码具有通用性,即以后实现该MvpView的类都可以适用于既有代码.
我们的例子比较简单,所以MvpView中只有一个showView()方法
该方法需要一个String data参数,在这个例子中就是Mode包传过来的字符串Hello Wrold.
接下来,我们定义一个MainActivity,让它实现MvpView,此时必须实现showView方法,我们可以直接通过Toast输出该字符串.但是注意,此处data并没有任何值,我们还没有开始写Mode用于向View传递数据呢!
Model包
我们同样定义一个所有mode的接口MvpModel,同样是为了达到提高通用性的效果
该接口中有一个抽象方法getData,用于实现获取数据的逻辑,注意,MVP模式中,逻辑都是在mode下实现的,然而我们要考虑的是怎样让我们获取的数据传给view?此时就要靠MVP中的presenter来实现啦,但是问题来了,怎样能让presenter能获得我们从mode传过去的数据呢?此处的解决方法是用接口回调,我们可以在mode中定义一个接口,在该接口中定义一个方法并将getData方法获取的数据设置为该接口的方法参数,此时,如果其他类中实现啦该接口,就必须实现该接口定义的方法,此时,该接口定义的方法的参数也就传入了其他类中,这就完成了数据的传递.
我们定义一个Model来实现MvpModel接口并重写getData方法,我们因该在此处写获取数据的逻辑,此处我们只是写一个简单的HelloWorld程序,所以我们直接用String data=”hello world”来假装我们已经通过某种途径获取啦数据,接下来我们就是要把该数据传递给presenter啦.
为了传递给presenter,我们用接口回调的方法,此处需要注意的是,这个getData方法是presenter负责调用的,所以presenter为了能拿到数据,它会在调用该方法的时候同时传递一个回调接口过来,我们只需要调用该回调接口的回调方法即可.
presenter
最后,让我们看看presenter的实现吧.
presenter负责接收view的请求数据,以及向mode请求数据并将请求得来的数据返回给view.同样,view和presenter的数据交互也是通过接口回调,就是我们一开始写的MvpView接口,MvpView接口中有个showView方法,该方法需要String类型的data,此处就是从mode中获取的数据HelloWorld.所以将从mode获取数据以及向view返回数据结合起来就是通过调用mode的getData方法,通过调用回调方法onLoadComplete从该回调方法的参数列表中获取从mode中返回的值再通过mvpView的showView方法返回数据给view来显示.此处需要注意的是,我们presenter中并没有modle对象,所以可以在构造函数中进行初始化,同时我们将实现上述功能的方法取个名字叫load.
最后的最后
我们直接在activity中调用new Presenter(this).load();该方法会调用presenter中的load方法,该load方法优又会回调mode中的onLoadComplete方法,此时已经获取啦从mode中返回的数据,这个时候又回调view中的showView方法将该数据传递给view
此时,view只需要和本文开始时一样用Toast显示即可