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