(Kotlin)MVP模式架构初识且简单实现

1.概念

(最近本人由Java转Kotlin所以这篇文章代码由Kotlin编写)
相对于MVC模式架构大家都已经听得够多了,那么MVP模式又是什么呢?
和MVC一样 MVP三个字母就代表三个东西
M:Model-模型:主要是实体模型,数据的存取与业务逻辑,主要负责数据的加载
V:View-视图:对应Activity(或Fragment),主要负责View的绘制以及用户交互。
P: Presenter: 负责View与Model间交互,可以理解为媒介,就像媒婆那样的功能。

2.优点

利用MVP架构的项目优点明显

  1. 降低耦合度,隐藏数据,使Activity(或Fragment)中代码更加简洁,只负责处理View的职责;
  2. 模块职责分工明确;
  3. 方便测试开发;
  4. 代码复用性较高。

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模式实现这么复杂,那我要告诉你着确实很复杂,但是当你的项目十分庞大它的优势就出来了。

猜你喜欢

转载自blog.csdn.net/qq_35416214/article/details/105106305