裝飾者模式

裝飾者模式:
動態地將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。
以飲料店配調料爲例:
//測試類
public class StarbuzzCoffee {
 public static void main(String[] args) {
  Beverage beverage = new Espresso();//點一杯沒有任何調料的咖啡
  System.out.println(beverage.getDescription()+"$"+beverage.cost());//打印描述和價格
  Beverage beverage2 = new HouseBlend();//點一杯摩卡、奶泡搭配的HouseBlend
  beverage2 = new Mocha(beverage2);
  beverage2 = new Whip(beverage2);
  System.out.println(beverage2.getDescription()+"$"+beverage2.cost());//打印描述和價格
 }
}

public abstract class Beverage {//飲料超類
 String description = "Unknown Beverage";
 
 public String getDescription() {
  return description;
 }
 
 public abstract double cost();
}
public class Espresso extends Beverage{//飲料
 public Espresso() {
  description = "Espresso";
 }
 public double cost() {
  return 1.99;
 }
}

public class HouseBlend extends Beverage{//飲料
 public HouseBlend() {
  description = "HouseBlend";
 }
 public double cost() {
  return .98;
 }
}
public abstract class CondimentDecorator extends Beverage{//裝飾者超類
 public abstract String getDescription();
}
public class Mocha extends CondimentDecorator{
 Beverage beverage;
 
 public Mocha(Beverage beverage) {
  this.beverage=beverage;
 }
 
 public String getDescription() {
  return beverage.getDescription()+",Mocha";
 }
 
 public double cost() {
  return .20+beverage.cost();
 }
}
public class Whip extends CondimentDecorator{
 Beverage beverage;
 
 public Whip(Beverage beverage) {
  this.beverage=beverage;
 }
 
 public String getDescription() {
  return beverage.getDescription()+",Whip";
 }
 
 public double cost() {
  return .30+beverage.cost();
 }
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息