コマンドデザインパターン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にました
リビングルームのテレビを消しました
お風呂を消しました
ディスカッション
コメント一覧
まだ、コメントがありません