19_Scala_设计模式_装饰者

举报
alexsully 发表于 2021/05/21 14:36:45 2021/05/21
【摘要】 装饰者模式

装饰者模式(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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。