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

  • 相关阅读:
    项目管理
    智能硬件如何确定需求:场景约束
    产品设计
    产品设计之前,如何分析业务需求和用户痛点?
    微信小程序挑一挑辅助
    C#实现冲顶大会辅助工具(截图+图像识别+搜索)
    读取配置文件--AppConfig
    文件各种上传,离不开的表单
    使用C#委托来实现异步编程
    Table 组件构建过程中遇到的问题与解决思路
  • 原文地址:https://www.cnblogs.com/FCY-LearningNotes/p/15032162.html
Copyright © 2020-2023  润新知