有一家咖啡店,你想喝杯咖啡,於是你走進咖啡店,咖啡店有主體濃縮咖啡、黑咖啡、深培咖啡,當然,咖啡中也可以加一些調料:豆漿、摩卡、奶泡等。每種咖啡或者調料,價格都不一樣,你可以單點一杯咖啡,也可以點一杯咖啡加上自己喜歡的調料。那麼價格怎麼算呢,我們可以通過裝飾者模式試試,先看一下咖啡調料UML類圖:
看一下價格計算過程,此圖來自《Head First 設計模式》:
再看看java代碼:
/**
* 咖啡抽象類,被裝飾者
*/
public abstract class Beverage {
String description = "咖啡";
public String getDescription() {
return description;
}
public abstract double cost();
}
/**
* 調料抽象類,就是裝飾者類
*/
public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();
}
三種不同的咖啡主體:
/**
* 濃縮咖啡
*/
public class Espresso extends Beverage {
public Espresso() {
description = "濃縮咖啡";
}
public double cost() {
return 1.99;
}
}
/**
* 黑咖啡
*/
public class HoseBlend extends Beverage {
public HoseBlend() {
description = "黑咖啡";
}
public double cost() {
return 0.99;
}
}
/**
* 深焙咖啡
*/
public class DarkRoast extends Beverage {
public DarkRoast() {
description = "深焙咖啡";
}
public double cost() {
return 0.19;
}
}
三種不同的調料:
/**
* 摩卡
*/
public class Mocha extends CondimentDecorator{
private Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", 摩卡";
}
public double cost() {
return 0.20 + beverage.cost();
}
}
/**
* 豆漿
*/
public class Soy extends CondimentDecorator {
private Beverage beverage;
public Soy(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", 豆漿";
}
public double cost() {
return 0.23 + beverage.cost();
}
}
/**
* 奶泡
*/
public class Whip extends CondimentDecorator {
private Beverage beverage;
public Whip(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", 奶泡";
}
public double cost() {
return 0.69 + beverage.cost();
}
}
最後看一下測試類及結果:
public class StrabuzzCoffee {
public static void main(String[] args) {
//單點一杯濃縮咖啡
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + ", $" + beverage.cost());
System.out.println("----------------------------------------------");
//一杯雙倍摩卡一份奶泡的黑咖啡
Beverage beverage2 = new HoseBlend();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription() + ", $" + beverage2.cost());
System.out.println("----------------------------------------------");
//一杯調料爲豆漿、摩卡、奶泡的深焙咖啡
Beverage beverage3 = new DarkRoast();
beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
System.out.println(beverage3.getDescription() + ", $" + beverage3.cost());
System.out.println("----------------------------------------------");
}
}
結果: