装饰模式

装饰模式

对扩展开放,对修改关闭

情景

对于一个奶茶店的一个菜单,先定义一个基类,然后有那种饮料就继承基类。在该子类中计算饮料的价钱。这样子类就非常的多,不宜维护。,,,,

如果使用装饰模式就可以很好的解决这个问题。将饮料作为主题,给它添加装饰。

  • 先看一下它的类图:

1745234347

component:每一个被装饰者和装饰者都继承于它。

concretecomponent: 被装饰者,都继承于component,这样装饰者都可以给任何被装饰者添加该特定的行为。

decorator: 装饰者,持有一个component的对象(即是被装饰者),给它添加一些行为。

  • 接着来实现一下上面的情形

component: (父类)

abstract class Beverage(){

    var desc: String = "Unknown Beverage"

    open fun getDescription() : String{
        return desc
    }

    abstract fun cost(): Double

}

concretecomponent: (被装饰者)

class DarkRoast : Beverage { //..

    constructor() {
        desc = "DarkRoast"
    }

    override fun cost(): Double {
        return .99
    }
}
 
class HouseBlend : Beverage { //综合

    constructor() {
        desc = "House Blend Coffee"
    }

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

}

decorator: (装饰者)

abstract class CondimentDecorator : Beverage() { //调料

    abstract override fun getDescription(): String
}
class Mocha : CondimentDecorator { //摩卡

    private var beverage : Beverage

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

    override fun getDescription(): String {
        return beverage.getDescription() + ", Mocha"
    }

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

}
class Whip : CondimentDecorator { //..

    private var beverage : Beverage

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

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

    override fun getDescription(): String {
        return beverage.getDescription() + ", Whip"
    }

}

最后组织一下:

class Test {

    companion object {

        @JvmStatic
        fun main(array: Array<String>) {
            var beverage : Beverage = Espresso()
            println(beverage.getDescription() + " $" + beverage.cost())

            var beverage2 : Beverage = DarkRoast()
            beverage2 = Mocha(beverage2)
            beverage2 = Mocha(beverage2)
            beverage2 = Whip(beverage2)
            println(beverage2.getDescription() + " $" + beverage2.cost())
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值