对象结构型模式——装饰者模式(decorator)

  • 定义:
    动态的给对象添加一些额外的职责。就增加功能来说,装饰者模式提供了比继承更加有弹性的另一种方案。
  • 概述:
    装饰者模式可以透明的给对象增加功能,并实现功能的组合。被装饰的对象可以已经被装饰过多次,在Java中I/O是装饰者模式的典型代表之一。
  • 实例(Kotlin语言)
    被装饰者的抽象类:饮料类
abstract class Beverage {
    //给一个默认的饮料名
    open var description = "Unknown Beverage"

    //给一个默认的饮料的价格
    open fun cost(): Double {
        return 0.0
    }
}

被装饰的类,饮料的一种:浓咖啡类

class Espresso : Beverage() {

    override var description: String
        get() = "Espresso"
        set(value) {}

    override fun cost(): Double {
        return 1.99
    }
}

装饰者的抽象类,调味类

abstract class CondimentDecorator : Beverage {

    val beverage: Beverage

    constructor(beverage: Beverage) {
        this.beverage = beverage
    }

    override var description: String
        get() = beverage.description
        set(value) {
            beverage.description = value
        }

    override fun cost(): Double {
        return beverage.cost()
    }
}

具体的装饰类:摩卡Mocha类

class Mocha(beverage: Beverage) : CondimentDecorator(beverage) {
    override var description: String
        get() = beverage.description + ",Mocha"
        set(value) {}

    override fun cost(): Double {
        return 0.2 + beverage.cost()
    }
}

具体的装饰类:奶油Whip类

class Whip(beverage: Beverage) : CondimentDecorator(beverage) {
    override var description: String
        get() = beverage.description + ",whip"
        set(value) {}

    override fun cost(): Double {
        return 0.5 + beverage.cost()
    }
}

测试类及测试结果

fun main(args: Array) {
    //未被装饰过的浓咖啡
    val espresso = Espresso()
    println("我要一杯浓咖啡(espresso)"+"--描述:"+espresso.description+";钱:"+espresso.cost())
    //用摩卡装饰过的咖啡
    val mocha = Mocha(espresso)
    println("我要一杯加了摩卡(mocha)的浓咖啡(espresso)--"+"--描述:"+mocha.description+";钱:"+mocha.cost())
    //用奶油装饰过的摩卡咖啡
    val whip = Whip(mocha)
    println("我要一杯加了摩卡(mocha)和奶油(whip)味的浓咖啡(espresso)"+"--描述:"+whip.description+";钱:"+whip.cost())
}

//测试结果
我要一杯浓咖啡(espresso)--描述:Espresso;钱:1.99
我要一杯加了摩卡(mocha)的浓咖啡(espresso)----描述:Espresso,Mocha;钱:2.19
我要一杯加了摩卡(mocha)奶油(whip)味的浓咖啡(espresso)--描述:Espresso,Mocha,whip;钱:2.69

Process finished with exit code 0
  • 类图
    对象结构型模式——装饰者模式(decorator)_第1张图片

如有错误,请留言更正,或进580725421群讨论,以免误导其他开发者!!!

你可能感兴趣的:(oo设计模式)