Kotlin(十六)设计模式-结构型模式(装饰者模式)

作者: zcwfeng | 来源:发表于2021-01-17 00:06 被阅读0次

结构型模式-装饰者

java 中我们给一个类扩展功能,有两种选择:

  1. 设计继承他的子类
  2. 使用装饰者模式对该类进行装饰,然后对功能进行扩展。

装饰模式:用类委托减少样板代码

不是所有场景都能满足继承扩展,所以装饰模式能够解决问题

装饰者模式
在不必要改变原有类和继承的情况,动态扩展对象一个功能。该模式通过创建包装对象,来包裹真实对象。

  • 创建一个包装类,包含一个需要装饰类的实例
  • 装饰类重写被装饰类的方法。
  • 在装饰类中对需要增强的功能进行扩展

组合优先继承,有时候会很啰嗦,可能存在大量样板代码,kotlin可以利用by关键字,将装饰类的所有方法委托给一个被装饰的类对象,然后只需要写装饰的方法即可。

interface MacBook{
    fun getCost():Int
    fun getDesc():String
    fun getProDate():String
}

class MacBookPro:MacBook{
    override fun getCost()=1000

    override fun getDesc()="MacBook Pro"

    override fun getProDate()="Late 2011"

}

class ProcessorUpgradeMacbookPro(val macbook:MacBook):MacBook by macbook{
    override fun getCost() = macbook.getCost() + 299
    override fun getDesc()= macbook.getDesc() + " 1G Memory"
}

fun main() {
    val macBook =MacBookPro()
    val updateMacbookPro = ProcessorUpgradeMacbookPro(macBook)
    println(updateMacbookPro.getCost())
    println(updateMacbookPro.getDesc())
    println(updateMacbookPro.getProDate())
}

升级后cost变化需要重写getCost,desc变化重写getDesc。ProcessorUpgradeMacbookPro类将所有方法委托给了macbook对象,生产年份不需要重写。

如果不用委托,在不继承Macbook类的前提下,那么我们需要创建一个装饰类和被装饰类的公共父类抽象。

通过扩展代替装饰者

举个栗子,一个Printer绘图类,三个方法,分别绘制实线,虚线,和星号线

class Printer {
    fun drawLine() {
        println("————————————")
    }

    fun drawDottedLine() {
        println("- - - - - - ")
    }

    fun drawStars() {
        println("***********")
    }
}

现在有个需求,希望在打印线开始和结束,分别打印开始和结束标记。
如果给每个绘制方法装饰新的增功能,非常冗余。所以,我们可以用扩展替代装饰模式。

fun Printer.startDraw(decrated:Printer.()->Unit){
    println("+++start drawing+++")
    decrated()
    println("+++end drawing+++")
}

》》》》
fun main() {
    Printer().run {
        startDraw {
            drawLine()
        }
        startDraw {
            drawDottedLine()
        }
        startDraw {
            drawStars()
        }
    }
}

总结一下Kotlin中的设计模式设计

  1. 改造工厂模式
  2. 内联函数简化抽象工厂
  3. 弱化构建者模式的使用
  4. 用委托属性实现观察者模式
  5. 高阶函数简化设计模式
  6. 重载iterator方法
  7. 偏函数实现责任链
  8. ADT实现状态模式
  9. 装饰着模式实现新思路:委托原来的类,用kotlin扩展替换装装饰者。

相关文章

  • JavaScript设计模式

    设计模式分类(23种设计模式) 创建型单例模式原型模式工厂模式抽象工厂模式建造者模式 结构型适配器模式装饰器模式代...

  • Kotlin(十六)设计模式-结构型模式(装饰者模式)

    结构型模式-装饰者 java 中我们给一个类扩展功能,有两种选择: 设计继承他的子类 使用装饰者模式对该类进行装饰...

  • JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计

    JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计模式 装饰器模式,又名装饰者模式。它的定义是“在不...

  • 常用的设计模式

    设计模式主要大概分成三类: 1.创建型:单例设计模式、抽象工厂设计模式 2.结构型:MVC 模式、装饰器模式、适配...

  • 设计模式之装饰器模式

    也称装饰者模式、装饰器模式、Wrapper、Decorator。 装饰模式是一种结构型设计模式,允许你通过将对象放...

  • Kotlin(八)kotlin设计模式-创建型

    创建型模式 - 工厂 Kotlin里面几种主流创建型设计模式:工厂方法模式,抽象工厂模式,构建者模式 8.1 伴生...

  • 设计模式分类汇总

    结构型 适配器模式 组合模式 桥接模式 代理模式 装饰者模式 门面模式 享元模式 行为型 责任链模式 命令模式 解...

  • iOS常用设计模式总结(一)

    设计模式大概分成三类: 1.创建型:单例设计模式、抽象工厂设计模式 2.结构型:MVC 模式、装饰器模式、适配器模...

  • 23种设计模式

    创建型 工厂模式 ( 工厂方法模式, 抽象工厂模式, 建造者模式 ) 单例模式 原型模式 结构型 适配器模式 装饰...

  • java23种设计模式

    创建型 抽象工厂模式工厂方法建造者模式原型模式单态模式 结构型 适配器模式桥接模式组合模式外观模式装饰者模式享元模...

网友评论

    本文标题:Kotlin(十六)设计模式-结构型模式(装饰者模式)

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