Skip to content

裝飾器模式

咖啡需要有各種添加風味物。

被添加的咖啡也是一種咖啡

Before

cpp
struct Coffee {
  std::optional<int> soy;
  std::optional<int> milk;
  // 我們可能會動態的增加添加物!
  
  int cost() {
    return soy.value_or(0)*2 + milk.value_or(0)*20;
  }
};

After

cpp
struct Coffee {
  Coffee() = default;
  virtual ~Coffee() = default;
  
  virtual int cost() = 0;
};

struct NormalCoffee: public Coffee {
  int cost() {
    return 20;
  }
};

struct SoyCoffee: public Coffee {
  Coffee* base_;
  int quantity_;
  SoyCoffee(Coffee* base, int quantity):
    base_(base), quantity_(quantity) {}
  
  int cost() {
    return base_->cost() + 2*quantity_;
  }
};

struct MilkCoffee: public Coffee {
  Coffee* base_;
  int quantity_;
  MilkCoffee(Coffee* base, int quantity):
    base_(base), quantity_(quantity) {}
  
  int cost() {
    return base_->cost() + 20*quantity_;
  }
};

Changelog

Just observe 👀