前回は基本的なCommandパターンを紹介しました。
今回はMacroCommandについて説明します。
MacroCommandとは、いくつかのCommandを登録でき、登録された順に順次Commandを実行するCommandです。
実装手順は以下のとおりです。
- 前回作成したICommandを実装するMacroCommandクラスを定義します。
- MacroCommandクラスのメンバとして、ICommandのListを定義します。
- Commandを追加するためのAddCommandメソッドを定義します。
- ICommand.Executeメソッドを実装します。内部では登録されたICommandのListの項目に対して、順次Executeメソッドを実行します。
コードとしては次のようになります。
C#
public class MacroCommand : ICommand
{
// 実行するCommandのList
private List<ICommand> cmdList = new List<ICommand>();
// 実行するCommandの追加
public void AddCommand(ICommand command)
{
this.cmdList.Add(command);
}
#region ICommand メンバ
public void Execute()
{
// すべてのCommandを実行
cmdList.ForEach(command => command.Execute());
}
#endregion
}
VB
Public Class MacroCommand
Implements ICommand
' 実行するCommandのList
Private cmdList As New List(Of ICommand)
' 実行するCommandの追加
Public Sub AddCommand(ByVal command As ICommand)
Me.cmdList.Add(command)
End Sub
Public Sub Execute() Implements ICommand.Execute
' すべてのCommandを実行
For Each command As ICommand In Me.cmdList
command.Execute()
Next
End Sub
End Class
それでは、MacroCommandを使用してみましょう。MacroCommandに登録するCommandとして、前回作成したLightOn/OffCommand、CDPlayerPlay/StopCommandを使います。
C#
public class Program
{
public static void Main(string[] args)
{
// Invokerのインスタンス作成
RemoteController remoCon = new RemoteController();
// Reciever:Lightのインスタンス作成
Light light = new Light();
// Reciever:CDPlayerのインスタンス作成
CDPlayer player = new CDPlayer();
// すべてOnにするMacroCommand作成
MacroCommand allOnCommand = new MacroCommand();
allOnCommand.AddCommand(new LightOnCommand(light));
allOnCommand.AddCommand(new CDPlayerPlayCommand(player));
// すべてOffにするMacroCommand作成
MacroCommand allOffCommand = new MacroCommand();
allOffCommand.AddCommand(new LightOffCommand(light));
allOffCommand.AddCommand(new CDPlayerStopCommand(player));
// Invoker:RemoteControllerにそれぞれMacroCommand設定
remoCon.OnCommand = allOnCommand;
remoCon.OffCommand = allOffCommand;
light.DisplayState();
player.DisplayState();
// OnCommand Invoke
remoCon.OnButtonWasPressed();
light.DisplayState();
player.DisplayState();
// OffCommand Invoke
remoCon.OffButtonWasPressed();
light.DisplayState();
player.DisplayState();
Console.ReadKey();
}
}
VB
Public Class Program
Public Shared Sub Main(ByVal args As String())
' Invokerのインスタンス作成
Dim remoCon As New RemoteController()
' Reciever:Lightのインスタンス作成
Dim light As New Light()
' Reciever:CDPlayerのインスタンス作成
Dim player As New CDPlayer()
' すべてOnにするMacroCommand作成
Dim allOnMacroCommand As New MacroCommand()
allOnMacroCommand.AddCommand(New LightOnCommand(light))
allOnMacroCommand.AddCommand(New CDPlayerPlayCommand(player))
' すべてOffにするMacroCommand作成
Dim allOffMacroCommand As New MacroCommand()
allOffMacroCommand.AddCommand(New LightOffCommand(light))
allOffMacroCommand.AddCommand(New CDPlayerStopCommand(player))
remoCon.OnCommand = allOnMacroCommand
remoCon.OffCommand = allOffMacroCommand
light.DisplayState()
player.DisplayState()
' InvokerよりOnCommand実行
remoCon.OnButtonWasPressed()
light.DisplayState()
player.DisplayState()
' InvokerよりOffCommand実行
remoCon.OffButtonWasPressed()
light.DisplayState()
player.DisplayState()
Console.ReadKey()
End Sub
End Class
実行結果は次のようになります。
ライト、CDプレイやのOn/OffがMacroCommandを1回実行することで、一斉に行われていることが確認できます。
さて、というわけで、今回はMacroCommandについて紹介しました。
次回はCommandパターンの使い方について、もう少し紹介します。