使用Kotlin实现MVP框架

引言:本文主要介绍怎样通过Kotlin语音实现MVP框架,不再对Kotlin语法和MVP进行讲述.
废话不多说,直接上代码:

Base基础包

#先定义抽象的三个接口,在接口中可以抽出公有的几个方法,根据自我需求随意发挥
interface IView {
    fun providerContext(): Context
}

interface IPresenter {

    fun attachView(view: IView)

    fun detachView()
}

interface IModel
#在封装一个BasePresenter,如果使用RxJava可以考虑抽出一个RxPresenter继承自BasePresenter
abstract class BasePresenter<T : IView> : IPresenter {
    var mView: WeakReference<T>? = null

    override fun attachView(view: IView) {
        mView = WeakReference(view as T)
    }

    override fun detachView() {
        mView = null
    }
}
#注意:此处使用星投影为了避免具体的Presenter无边界报错
abstract class BaseActivity<P : BasePresenter<*>> : AppCompatActivity(), IView {
    lateinit var mPresenter: P

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(onLayout())
        mPresenter = initPresenter()
        mPresenter.attachView(this)
        onCreated(savedInstanceState)

    }

    override fun providerContext(): Context {
        return this
    }

    override fun onDestroy() {
        super.onDestroy()
        mPresenter.detachView()
    }

    abstract fun onLayout() : Int

    abstract fun initPresenter() : P

    abstract fun onCreated(savedInstanceState: Bundle?)

}

具体实例

#此处以用户类为例
#用户Bean
data class User(val userName: String, val password: String)

#我们使用一个契约接口,对具体的某个逻辑的model,view和presenter进行封装
interface UserContract{

    interface View : IView{
        fun showData(user: User)
    }

    interface Model: IModel{
        fun loadData() : User
    }

    interface Presenter : IPresenter{
        fun contract()
    }
}

#用户Model,处理一些逻辑(获取用户名等)
class UserModel : UserContract.Model {

    override fun loadData(): User {
        return User("张三", "123456")
    }
}

#用户Presenter
class UserPresenter : BasePresenter<UserContract.View>(), UserContract.Presenter {

    val userModel : UserModel by lazy {
        UserModel()
    }

    override fun contract() {
        mView?.get()?.showData(userModel.loadData())
    }

}

#用户界面
class UserActivity : BaseActivity<UserPresenter>(), UserContract.View {

    var user: User? = null

    override fun onLayout(): Int {
        return R.layout.activity_user_layout
    }

    override fun onCreated(savedInstanceState: Bundle?) {
        mPresenter.contract()
        text_view.setOnClickListener { text_view.text = user?.userName }
    }

    override fun initPresenter(): UserPresenter {
        return UserPresenter()
    }

    override fun showData(user: User) {
        this.user = user
    }
}
#找张图片镇楼

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值