Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_0Number_7Number_5Number_1Number_2Number_2Number_4
インデント OCPとデザインパターン
インデント サンプルコードについて
インデント デザインパターン ひとくちメモ
インデント FactoryMethodパターン
インデント AbstractFactoryパターン
インデント Builderパターン
インデント Prototypeパターン
インデント Adapterパターン
インデント Bridgeパターン
インデント Compositeパターン
インデント Decoratorパターン
インデント Facadeパターン
インデント Flyweightパターン
インデント Proxyパターン
インデント TemplateMethodパターン
インデント Chain of Responsibilityパターン
インデント Commandパターン
インデント Iteratorパターン
インデント Mediatorパターン
インデント Mementoパターン
インデント Observerパターン
インデント Stateパターン
インデント Strategyパターン
インデント Visitorパターン
インデント 速習!デザインパターン第一回
インデント 速習!デザインパターン第二回
インデント 速習!デザインパターン第三回
インデント UMLとは
インデント UML入門
インデント オブジェクト指向
インデント クラス図
インデント アクティビティ図
インデント インタラクション図
インデント ユースケース図
インデント Rarestyle証明書サービス
インデント QRコード発行WSDL
インデント QRコード発行サンプル
インデント J2EE覚書
インデント FreeMind実践レポート
インデント モバイル情報
インデント Homeページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

Commandパターン (デザインパターン)

Commandパターン 導入

Commandパターンは共通のインターフェースを持つオブジェクトで「命令」を扱うことにより、処理履歴の管理や、処理の組み合わせなどを用意にするパターンです。まとまった処理を一つのクラスとして定義し、必要な場合そのクラスの操作を呼び出すことによって対応します。

Commandパターン ポイント

命令自身をオブジェクトとして分離する。

UML Commandパターン

C#ソースコード Commandパターン

Sample.cs

using System;

namespace Command
{
   //-------------------------------------------------------------------------
   //  デザインパターン Command
   //
   //  共通のインターフェースを持つオブジェクトで「命令」を扱うことにより
   //  処理履歴の管理や処理組み合わせのパターンを容易にする
   //
   //-------------------------------------------------------------------------

   //受信者
   //命令を受けて処理を行います
   public class Receiver
   {
       //複数のメソッドがあるとします

       //Action1とAction2は家事を行う
       public void Action1()
       {
           Console.WriteLine("掃除をする");
       }
       public void Action2()
       {
           Console.WriteLine("洗濯をする");
       }

       //Action3とAction4は支払いを行う
       public void Action3()
       {
           Console.WriteLine("電気料金を払う");
       }
       public void Action4()
       {
           Console.WriteLine("水道料金を払う");
       }
   }

   //抽象命令クラス
   public abstract class Command
   {
       protected Receiver res;

       //コンストラクタでセットしてみます
       public Command(Receiver res)
       {
           this.res=res;
       }
       //実際にはこのメソッドをInvokerで実行します
       public abstract void Execute();
   }

   //命令クラス(家事の部)
   public class ConcreteCommand_Task : Command
   {
       public ConcreteCommand_Task(Receiver res) :base(res)
       {
       }

       public override void Execute()
       {
           this.res.Action1();
           this.res.Action2();
       }
   }

   //命令クラス(支払いの部)
   public class ConcreteCommand_TaskPay : Command
   {
       public ConcreteCommand_TaskPay(Receiver res) :base(res)
       {
       }

       public override void Execute()
       {
           this.res.Action3();
           this.res.Action4();
       }
   }

   //実施者(命令するクラス)
   public class Invoker
   {
       private Command com;

       //プロパティで実装
       public Command SetCommand
       {
           set{this.com=value;}
       }

       //実施者は保持しているCommand(格納されるインスタンス)
       //でもって実行させます(ポリモーフィズムですね)
       public void ExecuteCommand()
       {
           com.Execute();
       }
   }

   /// <summary>
   /// Class1 の概要の説明です。
   /// </summary>
   class Class1
   {
       /// <summary>
       /// アプリケーションのメイン エントリ ポイントです。
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {
           //受信者(実際に実行するオブジェクト)
           Receiver res =new Receiver();

           //命令クラスのインスタンスを生成します
           //家事の分
           ConcreteCommand_Task task =new ConcreteCommand_Task(res);
           //支払の分
           ConcreteCommand_TaskPay pay =new ConcreteCommand_TaskPay(res);

           //命令者
           Invoker invoker =new Invoker();

           //命令者はセットした命令セットを実行します
           invoker.SetCommand=task;
           invoker.ExecuteCommand();

           invoker.SetCommand=pay;
           invoker.ExecuteCommand();
       }
   }
}

Command 実行結果

command_fig

UMLプラグインによる描画 Commandパターン

Javaソースコード Commandパターン

Command.java
   1: package command;
   2: 
   3: public abstract class Command {
   4: 
   5:     private Receiver receiver;
   6:     
   7:     public abstract void execute();
   8: 
   9:     public Receiver getReceiver() {
  10:         return receiver;
  11:     }
  12: 
  13:     public void setReceiver(Receiver receiver) {
  14:         this.receiver = receiver;
  15:     }
  16: 
  17: }
ConcreteCommand_Task.java
   1: package command;
   2: 
   3: public class ConcreteCommand_Task extends Command {
   4: 
   5:     private Receiver receiver;
   6: 
   7:     public ConcreteCommand_Task(Receiver receiver) {
   8:         this.setReceiver(receiver);
   9:     }
  10: 
  11:     public void execute() {
  12:         this.getReceiver().action1();
  13:         this.getReceiver().action2();
  14:     }
  15: }
ConcreteCommand_TaskPay.java
   1: package command;
   2: 
   3: public class ConcreteCommand_TaskPay extends Command {
   4: 
   5:     private Receiver receiver;
   6: 
   7:     public ConcreteCommand_TaskPay(Receiver receiver) {
   8:         this.setReceiver(receiver);
   9:     }
  10: 
  11:     public void execute() {
  12:         this.getReceiver().action3();
  13:         this.getReceiver().action4();
  14:     }
  15: }
Invoker.java
   1: package command;
   2: 
   3: public class Invoker {
   4: 
   5:     private Command command;
   6: 
   7:     public Command getCommand() {
   8:         return command;
   9:     }
  10: 
  11:     public void setCommand(Command command) {
  12:         this.command = command;
  13:     }
  14:     
  15:     public void executeCommand() {
  16:         this.command.execute();
  17:     }
  18: 
  19: }
Receiver.java
   1: package command;
   2: 
   3: public class Receiver {
   4: 
   5:     //複数のメソッドがあるとします。
   6:     
   7:     //action1(),action2()は家事を行う
   8:     public void action1() {
   9:         System.out.println("掃除をする");
  10:     }
  11:     public void action2() {
  12:             System.out.println("洗濯をする");
  13:     }
  14:     //action3(),action4()は支払を行う
  15:     public void action3() {
  16:             System.out.println("電気料金を支払う");
  17:     }
  18:     public void action4() {
  19:             System.out.println("水道料金を支払う");
  20:     }
  21: }
StartClass.java
   1: package command;
   2: 
   3: public class StartClass {
   4: 
   5:     public static void main(String[] args) {
   6:         
   7:         //受信者のオブジェクト(実際実行のオブジェクト)
   8:         Receiver receiver =new Receiver();
   9:         
  10:         //命令セット
  11:         ConcreteCommand_Task task =new ConcreteCommand_Task(receiver);
  12:         ConcreteCommand_TaskPay pay =new ConcreteCommand_TaskPay(receiver);
  13:         
  14:         //命令者
  15:         Invoker invoker =new Invoker();
  16:         invoker.setCommand(task);
  17:         invoker.executeCommand();
  18:         
  19:         invoker.setCommand(pay);
  20:         invoker.executeCommand();
  21:     }
  22: }



コミュニティマーカーデザインパターン「ひとくちメモ」へ

コミュニティマーカーHomeへもどる

お天気情報
東京都 東京 - 今日の天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
東京都 東京 - 明日の天気
晴時々曇 - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2010/09/03 17:00:00  ST: True
東京都 東京 - あさっての天気
曇時々晴 - リンク先
最高 最低
気温 34 27
湿度 93.2 80.6
取得日:2010/09/03 17:00:00  ST: True
大阪府 大阪 - 今日の天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
大阪府 大阪 - 明日の天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
大阪府 大阪 - あさっての天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
livedoorのWebサービスより提供
【工事中】お天気配信 ユーザー登録
Copyright 2006 Rarestyle このページへのリンクは確認不要です。
Programming by Xenon Project Team     postmaster@rarestyle.net
免責事項について
レアスタイルサイト内検索