1.概念
(最近本人由Java转Kotlin所以这篇文章代码由Kotlin编写)
相对于MVC模式架构大家都已经听得够多了,那么MVP模式又是什么呢?
和MVC一样 MVP三个字母就代表三个东西
M:Model-模型:主要是实体模型,数据的存取与业务逻辑,主要负责数据的加载
V:View-视图:对应Activity(或Fragment),主要负责View的绘制以及用户交互。
P: Presenter: 负责View与Model间交互,可以理解为媒介,就像媒婆那样的功能。
2.优点
利用MVP架构的项目优点明显
- 降低耦合度,隐藏数据,使Activity(或Fragment)中代码更加简洁,只负责处理View的职责;
- 模块职责分工明确;
- 方便测试开发;
- 代码复用性较高。
3.实现
现在对于Andorid开发的MVP设计模式还没有一个统一的标准,基于MVP思想可以有很多的实现方式,而谷歌推荐的MVP实现方式中,弱化了Model的作用,将Model融入到Presenter中,定义Contract契约类作为View和Presenter的接口,定义View和Presenter需要实现的方法,View和Presenter各自实现,做到了降低耦合度使代码工整。
我们举一个具体的例子
我们点击界面中的按钮,在上方显示数据(就是一个简单的功能)
贴上项目结构
Constract
/**
* @description:TODO
* @Author MRyan
* @Date 2020/3/2 13:50
* @Version 1.0
*/
interface MainConstract {
interface MainView {
fun onShowData(msg: String)
}
interface MainPresenter {
fun ShowData()
}
}
上文说了Constract是一个契约接口类,里面另一个View和Presenter要实现的方法,将View和Presenter联系到一起
Presenter
/**
* @description:TODO
* @Author MRyan
* @Date 2020/3/2 13:51
* @Version 1.0
*/
class MainPresenter : MainConstract.MainPresenter {
lateinit var mainView: MainConstract.MainView
constructor(view: MainConstract.MainView) {
mainView = view
}
override fun ShowData() {
var msg: String = "这是测试"
mainView.onShowData(msg)
}
}
上文我们说了,Presenter是View和Model交互的地方 这里我们实现了功能并回调给(View)Activity
View
class MainActivity : AppCompatActivity(), MainConstract.MainView {
lateinit var mainPresenter: MainPresenter
lateinit var mShowBtn: Button
lateinit var mShowTev: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mShowBtn = findViewById(R.id.btn_main_show)
mShowTev = findViewById(R.id.tev_main_show)
mainPresenter = MainPresenter(this)
mShowBtn.setOnClickListener() {
mainPresenter.ShowData()
}
}
override fun onShowData(msg: String) {
mShowTev.text = msg
}
}
MainActivity实现了重写的onShowData()方法,在重写的方法中我们实现数据显示在TextView上
这就完成了简单的MVP模式架构
我们如果想要添加功能 很简单明了。
我们在Constract中定义需要实现的方法
/**
* @description:TODO
* @Author MRyan
* @Date 2020/3/2 13:50
* @Version 1.0
*/
interface MainConstract {
interface MainView {
fun onShowData(msg: String)
fun onClearData()
}
interface MainPresenter {
fun ShowData()
fun ClearData()
}
}
在Persenter回调方法
/**
* @description:TODO
* @Author MRyan
* @Date 2020/3/2 13:51
* @Version 1.0
*/
class MainPresenter : MainConstract.MainPresenter {
lateinit var mainView: MainConstract.MainView
constructor(view: MainConstract.MainView) {
mainView = view
}
override fun ShowData() {
var msg: String = "这是测试"
mainView.onShowData(msg)
}
override fun ClearData() {
mainView.onClearData()
}
}
最后在Acitvity实现它
class MainActivity : AppCompatActivity(), MainConstract.MainView {
lateinit var mainPresenter: MainPresenter
lateinit var mShowBtn: Button
lateinit var mShowTev: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mShowBtn = findViewById(R.id.btn_main_show)
mShowTev = findViewById(R.id.tev_main_show)
mainPresenter = MainPresenter(this)
mShowBtn.setOnClickListener() {
mainPresenter.ShowData()
}
mShowBtn.setOnLongClickListener {
mainPresenter.ClearData()
true //这里返回True
}
}
override fun onShowData(msg: String) {
mShowTev.text = msg
}
override fun onClearData() {
mShowTev.text = ""
}
}
很简单吧,看看效果
也许你会问这么简单的功能用MVP模式实现这么复杂,那我要告诉你着确实很复杂,但是当你的项目十分庞大它的优势就出来了。