Head Firstデザインパターン
頭とからだで覚えるデザインパターンの基本
(オライリージャパン)
Eric Freeman (著), Elisabeth Freeman (著)
Kathy Sierra (著) Bert Bates (著)
佐藤 直生 (監訳), 木下 哲也 (翻訳)
有限会社 福龍興業 (翻訳)
開発環境
- OS X Yosemite - Apple (OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Java (プログラミング言語)
- javac (コンパイラ)
- java (application launcher)
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 コメント:
コメントを投稿