Android中的设计思想一

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间数据互换的桥梁。

原文地址:https://www.cnblogs.com/FCY-LearningNotes/p/15032162.html