まさるblog

越後在住子持ちプログラマー奮闘記 - Author:まさる(高野 将、TAKANO Sho)

目次

Blog 利用状況

ニュース

著書

2010/7発売


Web掲載記事

@IT

.NET開発を始めるVB6プログラマーが知るべき9のこと

CodeZine

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

第1回 3層データバインドを正しく活用しよう(前編)

ブログパーツ


書庫

日記カテゴリ

コミュニティ

デザインパターンを学ぶ~その22:Commandパターン(2)~

前回は基本的なCommandパターンを紹介しました。

今回はMacroCommandについて説明します。

 

MacroCommandとは、いくつかのCommandを登録でき、登録された順に順次Commandを実行するCommandです。

実装手順は以下のとおりです。

  1. 前回作成したICommandを実装するMacroCommandクラスを定義します。
  2. MacroCommandクラスのメンバとして、ICommandのListを定義します。
  3. Commandを追加するためのAddCommandメソッドを定義します。
  4. 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

実行結果は次のようになります。

image

ライト、CDプレイやのOn/OffがMacroCommandを1回実行することで、一斉に行われていることが確認できます。

 

 

さて、というわけで、今回はMacroCommandについて紹介しました。

次回はCommandパターンの使い方について、もう少し紹介します。

投稿日時 : 2009年1月6日 22:54

Feedback

No comments posted yet.
タイトル
名前
Url
コメント