2014年10月31日金曜日

開発環境

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本 (Eric Freeman 著、Elisabeth Freeman 著、Kathy Sierra 著、Bert Bates 著、佐藤 直生 監訳、木下 哲也 翻訳、有限会社 福龍興業 翻訳、オライリージャパン)の3章(Decoratorパターン: オブジェクトの装飾)、自分で考えてみよう(p.99)を解いてみる。

その他参考書籍

自分で考えてみよう(p.99)

コード(BBEdit, Emacs)

Size.java

public enum Size {TALL, GRANDE, VENTI};

Beverage.java

public abstract class Beverage {
    String description = "不明な飲み物";
    Size size = Size.GRANDE;

    public String getDescription() {
        return description;
    }

    public void setSize(Size size) {
        this.size = size;
    }
    
    public Size getSize() {
        return this.size;
    }
    
    public abstract double cost();
}

Espresso.java

public class Espresso extends Beverage {
    public Espresso() {
        description = "エスプレッソ";
    }

    public double cost() {
        return 1.99;
    }
}

CondimentDecorator.java

public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}

Soy.java

public class Soy extends CondimentDecorator {
    Beverage beverage;

    public Soy(Beverage beverage) {
        this.beverage = beverage;
    }

    public String getDescription() {
        return beverage.getDescription() + "、豆乳";
    }

    public void setSize(Size size)
    {
        beverage.setSize(size);
    }

    public double cost() {
        double cost = beverage.cost();
        switch (beverage.getSize()) {
        case TALL:
            cost += .10;
            break;
        case GRANDE:
            cost += .15;
            break;
        case VENTI:
            cost += .20;
            break;
        }
        return cost;
    }
}

StarbuzzCoffee.java

public class StarbuzzCoffee {
    public static void main(String[] args)
    {
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription() + " $" + beverage.cost());

        Beverage beverage1 = new Espresso();
        beverage1 = new Soy(beverage1);
        System.out.println(beverage1.getDescription() + " $" +
                           beverage1.cost());

        Beverage beverage2 = new Espresso();
        beverage2 = new Soy(beverage2);
        beverage2.setSize(Size.TALL);
        System.out.println(beverage2.getDescription() + " $" +
                           beverage2.cost());

        Beverage beverage3 = new Espresso();
        beverage3 = new Soy(beverage3);
        beverage3.setSize(Size.GRANDE);
        System.out.println(beverage3.getDescription() + " $" +
                           beverage3.cost());

        Beverage beverage4 = new Espresso();
        beverage4 = new Soy(beverage4);
        beverage4.setSize(Size.VENTI);
        System.out.println(beverage4.getDescription() + " $" +
                           beverage4.cost());
    }
}

入出力結果(Terminal)

$ javac Size.java Beverage.java CondimentDecorator.java Espresso.java Soy.java
$ java StarbuzzCoffee
エスプレッソ $1.99
エスプレッソ、豆乳 $2.14
エスプレッソ、豆乳 $2.09
エスプレッソ、豆乳 $2.14
エスプレッソ、豆乳 $2.19
$ 

0 コメント:

コメントを投稿