MVP
mvp解耦性比mvc更好,model层负责提供数据,view层负责显示,presenter层负责逻辑处理,presenter层持有model层和view层,Activity持有presenter层。
IModel
interface IModel {
fun destroy()
}
BaseModel
class BaseModel:IModel {
override fun destroy() {
}
}
IView
interface IView {
fun showDialog()
fun hideDialog()
fun showToast(msg:String)
}
IPresenter
interface IPresenter {
fun destroy()
}
BasePresenter
open class BasePresenter<M :IModel,V :IView> : IPresenter {
override fun destroy() {
}
}
IActivity
interface IActivity {
fun bindLayout():Int
fun initView()
fun initData()
fun inject()
}
BaseActivity
abstract class BaseActivity<P : IPresenter> : AppCompatActivity(), IView, IActivity {
protected var mPresenter: P? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(bindLayout())
inject()
initView()
initData()
}
override fun showToast(msg: String) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT)
}
}
IFragmrnt
interface IFragment {
fun bindLyout(): Int
fun initView(view: View)
fun inject()
fun initData()
}
BaseFragment
abstract class BaseActivity<P : IPresenter> : AppCompatActivity(), IView, IActivity {
protected var mPresenter: P? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(bindLayout())
inject()
initView()
initData()
}
override fun showToast(msg: String) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT)
}
}
Contract
契约类 方便管理
interface MainContract {
interface MainView : IView {
}
interface MainModel : IModel {
}
}
Model层
class MainModel :MainContract.MainModel {
override fun destroy() {
}
//Model层负责提供数据 例如:网络请求接口等在model层完成
}
Presenter层
class MainPresenter : BasePresenter<MainContract.MainModel, MainContract.MainView>() {
//Presenter层负责逻辑处理,持有model层和view层,可以通过model层中的方法获取到数据,view层中的方法更新UI
override fun destroy() {
super.destroy()
}
}
View层
view层以Activity为载体,但Activity不是view,view中的方法在Activity中重写,进行更新UI的操作
class MainActivity :BaseActivity<MainPresenter>(),MainContract.MainView, View.OnClickListener {
override fun onClick(v: View?) {
when(v?.id){
R.id.btn_one -> showToast("one")
R.id.btn_two -> showToast("two")
}
}
override fun showDialog() {
}
override fun hideDialog() {
}
override fun bindLayout(): Int {
return R.layout.activity_main
}
override fun initView() {
btn_one.setOnClickListener(this)
btn_two.setOnClickListener(this)
}
override fun initData() {
}
override fun inject() {
}
}