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 著、佐藤 直生 監訳、木下 哲也 翻訳、有限会社 福龍興業 翻訳、オライリージャパン)の6章(Commandパターン: 呼び出しのカプセル化)、知力(p.221)を解いてみる。
その他参考書籍
知力(p.221)
コード(BBEdit, Emacs)
Speed.java
public enum Speed {HIGH, MEDIUM, LOW, OFF};
CeilingFan.java
public class CeilingFan {
String location;
Speed speed;
public CeilingFan(String location) {
this.location = location;
speed = Speed.OFF;
}
public void high() {
speed = Speed.HIGH;
System.out.println(location + "の扇風機の強さは「強」です。");
}
public void medium() {
speed = Speed.MEDIUM;
System.out.println(location + "の扇風機の強さは「中」です。");
}
public void low() {
speed = Speed.LOW;
System.out.println(location + "の扇風機の強さは「弱」です。");
}
public void off() {
speed = Speed.OFF;
System.out.println(location + "の扇風機は止まりました。");
}
public Speed getSpeed() {
return speed;
}
}
CeilingFanLowCommand.java
public class CeilingFanLowCommand implements Command {
CeilingFan ceilingFan;
Speed prevSpeed;
public CeilingFanLowCommand(CeilingFan ceilingFan) {
this.ceilingFan = ceilingFan;
}
public void execute() {
prevSpeed = ceilingFan.getSpeed();
ceilingFan.low();
}
public void undo() {
switch (prevSpeed) {
case HIGH: ceilingFan.high(); break;
case MEDIUM: ceilingFan.medium(); break;
case LOW: ceilingFan.low(); break;
case OFF: ceilingFan.off(); break;
default: break;
}
}
}
CeilingFanMediumCommand.java
public class CeilingFanMediumCommand implements Command {
CeilingFan ceilingFan;
Speed prevSpeed;
public CeilingFanMediumCommand(CeilingFan ceilingFan) {
this.ceilingFan = ceilingFan;
}
public void execute() {
prevSpeed = ceilingFan.getSpeed();
ceilingFan.medium();
}
public void undo() {
switch (prevSpeed) {
case HIGH: ceilingFan.high(); break;
case MEDIUM: ceilingFan.medium(); break;
case LOW: ceilingFan.low(); break;
case OFF: ceilingFan.off(); break;
default: break;
}
}
}
CeilingFanOffCommand.java
public class CeilingFanOffCommand implements Command {
CeilingFan ceilingFan;
Speed prevSpeed;
public CeilingFanOffCommand(CeilingFan ceilingFan) {
this.ceilingFan = ceilingFan;
}
public void execute() {
prevSpeed = ceilingFan.getSpeed();
ceilingFan.off();
}
public void undo() {
switch (prevSpeed) {
case HIGH: ceilingFan.high(); break;
case MEDIUM: ceilingFan.medium(); break;
case LOW: ceilingFan.low(); break;
case OFF: ceilingFan.off(); break;
default: break;
}
}
}
RemoteLoader.java
public class RemoteLoader {
public static void main(String[] args) {
RemoteControlWithUndo remoteControl = new RemoteControlWithUndo();
CeilingFan ceilingFan = new CeilingFan("部屋");
CeilingFanLowCommand ceilingFanLowCommand =
new CeilingFanLowCommand(ceilingFan);
CeilingFanMediumCommand ceilingFanMediumCommand =
new CeilingFanMediumCommand(ceilingFan);
CeilingFanOffCommand ceilingFanOffCommand =
new CeilingFanOffCommand(ceilingFan);
remoteControl.setCommand(0, ceilingFanLowCommand, ceilingFanOffCommand);
remoteControl.setCommand(1, ceilingFanMediumCommand,
ceilingFanOffCommand);
remoteControl.onButtonWasPushed(0);
remoteControl.offButtonWasPushed(0);
System.out.println(remoteControl);
remoteControl.undoButtonWasPushed();
remoteControl.onButtonWasPushed(1);
remoteControl.offButtonWasPushed(1);
System.out.println(remoteControl);
remoteControl.undoButtonWasPushed();
}
}
入出力結果(Terminal)
$ javac *.java $ java RemoteLoader 部屋の扇風機の強さは「弱」です。 部屋の扇風機は止まりました。 ------ リモコン ------ [スロット0] CeilingFanLowCommand CeilingFanOffCommand [スロット1] CeilingFanMediumCommand CeilingFanOffCommand [スロット2] NoCommand NoCommand [スロット3] NoCommand NoCommand [スロット4] NoCommand NoCommand [スロット5] NoCommand NoCommand [スロット6] NoCommand NoCommand [undo] CeilingFanOffCommand 部屋の扇風機の強さは「弱」です。 部屋の扇風機の強さは「中」です。 部屋の扇風機は止まりました。 ------ リモコン ------ [スロット0] CeilingFanLowCommand CeilingFanOffCommand [スロット1] CeilingFanMediumCommand CeilingFanOffCommand [スロット2] NoCommand NoCommand [スロット3] NoCommand NoCommand [スロット4] NoCommand NoCommand [スロット5] NoCommand NoCommand [スロット6] NoCommand NoCommand [undo] CeilingFanOffCommand 部屋の扇風機の強さは「中」です。 $
0 コメント:
コメントを投稿