【问题标题】:Why we need abstract decorator class in Decorator Pattern?为什么我们需要装饰器模式中的抽象装饰器类?
【发布时间】:2019-01-18 19:22:29
【问题描述】:

Decorator Pattern,如果我

  1. 移除装饰器继承的抽象装饰器类
  2. decorators直接继承decoratee的接口。

输出是一样的。

我的问题是为什么还要添加额外的abstractor class 来制作装饰器?


例如:

标准decorator patternScala源代码在这里:https://gist.github.com/kencoba/1875983

虽然我遵循上述步骤的版本如下: (通过删除抽象装饰器类(CoffeeDecorator 这里)并让装饰器直接继承被装饰者(Coffee 这里))

trait Coffee {
  def cost: Double
  def ingredients: String
}

//abstract class CoffeeDecorator(decoratedCoffee: Coffee) extends Coffee {
//  val sep = ", "
//
//  override def cost = decoratedCoffee.cost
//  override def ingredients = decoratedCoffee.ingredients
//}

class Milk(decoratedCoffee: Coffee) extends Coffee {
  override def cost = decoratedCoffee.cost + 0.5
  override def ingredients = decoratedCoffee.ingredients + "," + "Milk"
}

class Whip(decoratedCoffee: Coffee) extends Coffee {
  override def cost = decoratedCoffee.cost + 0.7
  override def ingredients = decoratedCoffee.ingredients + "," + "Whip"
}


object DecoratorSample {... // same as the comparing source code.

【问题讨论】:

    标签: java scala design-patterns decorator


    【解决方案1】:

    在摆弄之后,我发现了不同之处。 该抽象装饰器提供了默认的覆盖,因此在某些情况下,它可以减少装饰器实现的类型,因为我们并不总是装饰所有方法并提供通用帮助器。

    trait Coffee {
      def cost: Double
      def ingredients: String
    }
    
    class FreeMilk(decoratedCoffee: Coffee) extends Coffee {
      // this is a waste of line
      override def cost = decoratedCoffee.cost 
      override def ingredients = decoratedCoffee.ingredients + "," + "Milk"
    }
    
    abstract class CoffeeDecorator(decoratedCoffee: Coffee) extends Coffee {
      val sep = ", "
      override def cost = decoratedCoffee.cost
      override def ingredients = decoratedCoffee.ingredients
    }
    class FreeMilk2(decoratedCoffee: Coffee) extends CoffeeDecorator(decoratedCoffee) {
      // less typings and give you some base helpers
      override def ingredients = super.ingredients + sep + "Milk"
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 2010-09-21
      • 2011-03-29
      • 2018-04-17
      • 2012-03-22
      • 2018-01-02
      • 1970-01-01
      • 2018-02-23
      相关资源
      最近更新 更多