19_Scala_设计模式_装饰者
【摘要】 装饰者模式
装饰者模式(Decorator)
1 动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)
2 这里提到的动态的将新功能附加到对象和ocp原则,在后面的应用实例上会以代码的形式体现
装饰者模式就像打包一个快递
主体:Component drink
包装:Decorator
ConcreteComponent和Decorator
ConcreteComponent:具体的主体,比如前面的各个单品咖啡
Decorator: 装饰者,比如各调料.
在如图的Component与ConcreteComponent之间,
如果ConcreteComponent类很多,还可以设计一个缓冲层,将共有的部分提取出来,抽象层一个类。
abstract class Drink {
var desc : String = ""
var price: Float = 0.0f
def setDesc (desciption: String) ={
this.desc = desciption
}
def getDesc (): String ={
desc + "价格: " + this.price
}
def getPrice(): Float ={
this.price
}
def setPrice(pdtPrice: Float) ={
this.price = pdtPrice
}
def cost() :Float
}
class Coffee extends Drink {
override def cost(): Float = {
super.getPrice()
}}
class Espresso extends Coffee {
super.setDesc("Expreso")
super.setPrice(10.0f)
}
class AmaricaBlack extends Coffee {
super.setDesc("AmricaBlack")
super.setPrice(5.0f)
}
//这个就是Decorator装饰者
class CoffeeDecorator extends Drink {
private var obj: Drink = null
//obj就是被装饰的对象Drink
//obj可以是单品咖啡,也可以是单品咖啡+调料的组合
def this (obj: Drink){
this
this.obj = obj
}
//这里我们实现了cost,这里使用了递归方式
override def cost(): Float = {
super.getPrice() + obj.price
}
//获取信息时,也需要递归获取
override def getDesc(): String = {
super.getDesc() + " && " + obj.getDesc()
}}
class Milk(obj: Drink) extends CoffeeDecorator {
setDesc("牛奶")
setPrice(0.5f)
}
class Sugar(obj: Drink) extends CoffeeDecorator {
setDesc("糖")
setPrice(1.0f)
}
object Bar {
def main(args: Array[String]): Unit = {
var coffee_order1: Drink = new Espresso
coffee_order1 = new Milk(coffee_order1)
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)