2014年11月10日月曜日

開発環境

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 コメント:

コメントを投稿