Android设计思想
直接上示例 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="20dp"
tools:context=".mvc.MVCActivity">
<EditText
android:id="@+id/et_userName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:background="@color/purple_200" />
<Button
android:id="@+id/log"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/black"
android:onClick="onLogClick"
android:text="登录" />
</LinearLayout>
/**
* MVC模式登陆案例
*/
class MVCActivity : AppCompatActivity() {
private lateinit var userName: EditText
private lateinit var logIn: Button
private var model: MVCModel = MVCModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main4)
}
/**
* 当登陆按钮被点击
*/
fun onLogClick(v: View) {
userName.setText(model.getData(userName.text.toString()))
Toast.makeText(this, userName.text.toString(), Toast.LENGTH_SHORT).show()
}
override fun onContentChanged() {
super.onContentChanged()
userName = findViewById(R.id.et_userName)
logIn = findViewById(R.id.log)
}
}
class MVCModel {
fun getData(data: String): String {
return data + "asd"
}
}
MVCModel作为MVC中的model部分数据的处理与获取都在Model中进行。
Activity作为Controller作为Model与View的交互节点。view上的点击事件的处理在Controller中具体实现。表现为View ->controller。controller拿到数据以后将数据交给Model,Model处理完数据以后返回处理完的数据给Controller即MVCActivity,然后Controller将数据显示在View上即使用Toast显示。
MVC:当界面复杂的时候,Controller中的代码会比较多,可能要控制和改变各种view的显示和状态.常见的优化操作是将View抽离,比如下面代码。
/**
* MVC模式登陆案例
*/
class MVCActivity : AppCompatActivity() {
private lateinit var mView: LogView
private var model: MVCModel = MVCModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.mvc_new)
}
}
class MVCModel {
fun getData(data: String): String {
return data + "asd"
}
}
class LogView(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : LinearLayout(context, attrs, defStyleAttr) {
private val model: MVCModel = MVCModel()
private var userName: EditText
private var logIn: Button
private val mView: View = LayoutInflater.from(context).inflate(R.layout.log_view, this, false)
init {
userName = mView.findViewById(R.id.et_userName)
logIn = mView.findViewById(R.id.log)
addView(mView)
logIn.setOnClickListener {
val data = model.getData(userName.text.toString())
Toast.makeText(context, data, Toast.LENGTH_SHORT).show()
}
}
}
我们再来看一下MVP上的设计思想 看下面代码 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
class Presenter(view: IView) {
// model层引用
private val dataSource: IData = Model()
// view层引用
private val mView: IView = view
public fun processData(data: String) {
val processData = dataSource.processData(data)
mView.showRes(processData)
}
interface IView {
// activity实现用于将处理完数据更新到view上
fun showRes(processData: String)
}
interface IData {
fun processData(data: String): String
}
}
// 一般model层将加工的数据通过callback的形式回调给presenter层,为了简单少写了接口
class Model : Presenter.IData {
override fun processData(data: String): String {
return data + "asd"
}
}
class MVPActivity : AppCompatActivity(), Presenter.IView {
private lateinit var et: EditText
// presenter层引用
private val presenter: Presenter = Presenter(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main4)
et = findViewById(R.id.et_userName)
findViewById<View>(R.id.log).setOnClickListener {
presenter.processData(et.text.toString())
}
}
// presenter层数据回调
override fun showRes(processData: String) {
Toast.makeText(this, processData, Toast.LENGTH_SHORT).show()
}
}
MVP将Activity中的部分代码给抽离出来部分,并且MVP中大量使用的面向接口编程也是为了降低各层次间的耦合,presenter作为view与model间数据互换的桥梁。