コマンドデザインパターン5(マクロ)

コマンド設計パターンの実現テストします

シナリオ

コマンドデザインパターン4にマクロ機能(いっぺんに操作する)を追加して基本機能を確認します
掲載コード以外は、コマンドデザインパターン3を使います
また、デバイスでコマンドデザインパターンに存在しないものは新しく作成します

クラス図

RemoteLoaderコード

リモコンのスロットにロードされる多数のコマンドオブジェクトを作成します
コマンドオブジェクトは、ホームオートメーションデバイスのリクエストをカプセル化します

namespace P226Command
{
    public class RemoteLoader
    {
        public static void Main()
        {
            RemoteLoader remoteLoader = new RemoteLoader();
            remoteLoader.Run();
        }

        public void Run()
        {
            RemoteControlWithUndo remoteControl = new RemoteControlWithUndo();

            // 照明デバイスを作成します
            Light light = new Light("リビングルーム");
            // テレビデバイスを作成します
            TV tV = new TV("リビングルーム");
            // オーディオデバイスを作成します
            Stereo stereo = new Stereo("リビングルーム");
            // お風呂デバイスを作成します
            Hottab hottab = new Hottab();

            // ライトを制御するコマンドを作成します
            LightOnCommand lightOn = new LightOnCommand(light);
            LightOffCommand lightOff = new LightOffCommand(light);

            // テレビを制御する
            TvOnCommand tvOn = new TvOnCommand(tV);
            TvOffCommand tvOff = new TvOffCommand(tV);

            // オーディオを制御するコマンドを作成します
            StereoOnWithCDCommand stereoOnWithCD = new StereoOnWithCDCommand(stereo);
            StereoOffWithCDCommand stereoOffWithCD = new StereoOffWithCDCommand(stereo);

            // お風呂を制御するコマンドを作成します
            HottabOnCommand hottabOn = new HottabOnCommand(hottab);
            HottabOffCommand hottabOff = new HottabOffCommand(hottab);

            // OnコマンドとOffコマンド用の配列を作成します
            ICommand[] partyOn = { lightOn, stereoOnWithCD, tvOn, hottabOn };
            ICommand[] partyOff = { lightOff, stereoOffWithCD, tvOff, hottabOff };

            // それぞれの配列をもつ2つのマクロを作成します
            MacroCommand partyOnMacro = new MacroCommand(partyOn);
            MacroCommand partyOffMacro = new MacroCommand(partyOff);

            // コマンドが作成できたので、リモコンのスロットにロードできます
            remoteControl.SetCommand(0, partyOnMacro, partyOffMacro);

            Console.WriteLine(remoteControl);

            Console.WriteLine("----マクロのOnを押す----");

            remoteControl.OnButtonWasPushed(0);

            Console.WriteLine("----マクロのOffを押す----");

            remoteControl.OffButtonWasPushed(0);
        }
    }
}

MacroCommandコード

namespace P226Command
{
    internal class MacroCommand : ICommand
    {
        private ICommand[] partyOn;

        public MacroCommand(ICommand[] partyOn)
        {
            this.partyOn = partyOn;
        }

        public void Execute()
        {
            for (int i = 0; i < partyOn.Length; i++)
            {
                partyOn[i].Execute();
            }
        }

        public void Undo()
        {
            for (int i = partyOn.Length - 1; i >= 0; i--)
            {
                partyOn[i].Undo();
            }
        }
    }
}

結果

—– リモコン —–
[スロット0] MacroCommand MacroCommand
[スロット1] NoCommand NoCommand
[スロット2] NoCommand NoCommand
[スロット3] NoCommand NoCommand
[スロット4] NoCommand NoCommand
[スロット5] NoCommand NoCommand
[スロット6] NoCommand NoCommand
[アンドウ] NoCommand
—-マクロのOnを押す—-
リビングルーム照明を点けました
ステレオをOnにしました
CDをセットました
ボリュームを22にしました
リビングルームのテレビを点けました
お風呂を沸かしました
—-マクロのOffを押す—-
リビングルーム照明を消しました
ステレオをOffにました
リビングルームのテレビを消しました
お風呂を消しました

参考