美文网首页
Android Kotlin 设计模式之原型模式

Android Kotlin 设计模式之原型模式

作者: 水天滑稽天照八野滑稽石 | 来源:发表于2020-01-20 17:39 被阅读0次

    前言

    继续填坑,这次是原型模式

    什么是原型模式

    首先在java里面是存在深拷贝和浅拷贝的

    • 深拷贝: 完全复制生成一个新的对象,修改生成后的对象内容对源对象无影响
    • 浅拷贝: 直接引用源对象,修改生成后的对象内容对源对象有影响

    而我们常用的 = 本质上就是浅拷贝

        @Test
        fun test(){
            val stu1 = Student("xiao",12)
            println("stu1  name:${stu1.name}  age:${stu1.age}")
            val stu2 = stu1
            stu2.name = "da"
            stu2.age = 15
            println("stu1  name:${stu1.name}  age:${stu1.age}")
        }
    
        class Student(var name: String,
                      var age: Int)
    
    

    除了基本数据类型

        @Test
        fun test(){
            val a = 12
            println("a:$a")
            var b = a
            b = 13
            println("a:$a")
        }
    

    这个是和java的常量池有关,这个下次再说
    所以原型模式就是一个深拷贝来着
    如我们Android里面的intent
        @Test
        fun test00() {
            val intent1 = Intent()
            intent1.putExtra("xiao","xiao")
            val intent2 = intent1.clone() as Intent
            intent2.putExtra("da","da")
            println("intent1 da:${intent1.getStringExtra("da")}")
        }
    

    正文

    写原型模式的话在kotlin里面有以下2种写法

    • 实现cloneable接口并重写clone方法
     @Test
        fun test(){
            val stu1 = Student("xiao",12)
            println("stu1  name:${stu1.name}  age:${stu1.age}")
            val stu2 = stu1.clone()
            stu2.name = "da"
            stu2.age = 15
            println("stu1  name:${stu1.name}  age:${stu1.age}")
        }
    
        class Student(var name: String,
                      var age: Int) : Cloneable{
    
            public override fun clone(): Student {
                return super.clone() as Student
            }
        }
    
    • 使用data关键字
     @Test
        fun test(){
            val stu1 = Student("xiao",12)
            println("stu1  name:${stu1.name}  age:${stu1.age}")
            val stu2 = stu1.copy()
            stu2.name = "da"
            stu2.age = 15
            println("stu1  name:${stu1.name}  age:${stu1.age}")
        }
    
        data class Student(var name: String,
                      var age: Int)
    

    相关文章

      网友评论

          本文标题:Android Kotlin 设计模式之原型模式

          本文链接:https://www.haomeiwen.com/subject/hhgjzctx.html