java-裝飾者模式

有一家咖啡店,你想喝杯咖啡,於是你走進咖啡店,咖啡店有主體濃縮咖啡、黑咖啡、深培咖啡,當然,咖啡中也可以加一些調料:豆漿、摩卡、奶泡等。每種咖啡或者調料,價格都不一樣,你可以單點一杯咖啡,也可以點一杯咖啡加上自己喜歡的調料。那麼價格怎麼算呢,我們可以通過裝飾者模式試試,先看一下咖啡調料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("----------------------------------------------");
    }

}

結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章