zoukankan      html  css  js  c++  java
  • 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间数据互换的桥梁。

  • 相关阅读:
    SQLServer之删除用户自定义数据库用户
    Oracle expdp/impdp导出导入命令及数据库备份
    ORACLE EXP/IMP的使用详解
    《JAVA与模式》之抽象工厂模式
    Oracle中的Temporary tablespace的作用
    Oracle常用函数笔记
    java Map及Map.Entry详解
    LinkedHashMap和HashMap的比较使用
    win7 64系统安装oracle客户端使用PL/SQL Developer工具
    PL/SQL 创建视图语法
  • 原文地址:https://www.cnblogs.com/FCY-LearningNotes/p/15032162.html
Copyright © 2011-2022 走看看