Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_1Number_3Number_9Number_3Number_0Number_8Number_9
インデント 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ページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

Chain Of Responsibilityパターン (デザインパターン)

Chain of Responsibilityパターン 導入

Chain Of Responsibilityパターンは、要求に対する処理が完了するまで、要求を受信する複数 のオブジェクトをチェーン状につなぎ、要求を引き続いて処理していくパターンです。

言い換えると、ある処理を処理するのにその特定できるオブジェクトが不明な場合、現在処理しているオブジェクトに次の処理者を登録して、チェーンのようにつなぎながら、処理できるオブジェクトに到達するまで、順次要求を渡していく方法です。

Chain Of Responsibilityパターン ポイント

具象処理者の抽象クラスとしてHandlerを定義します。具象処理者で処理できない場合は、 次の処理者を呼び出し処理を継続させますが、このときHandlerに定義されたインターフェースを 通じてアクセスします。 クライアントの立場から考えると、最初に具象処理者に処理依頼をかけるだけで、オブジェクトの鎖 の順番で 処理が完了するまで要求がわたっていきます。要求側で処理を任せるオブジェクトの掌握が 不要になるだけでなく、処理するオブジェクトたちのメンテナンス性も向上します。

UML Chain of Responsibilityパターン

C#ソースコード

Sample.cs

using System;

namespace ChainOfResponsibility
{
   //-------------------------------------------------------------
   //  デザインパターン Chain of Responsibility
   //  ある要求に対する処理が完了するまで、チェーンのようにつながった
   //  オブジェクトを次々と処理を委ねるパターン
   //
   //-------------------------------------------------------------

   //抽象処理者クラス
   public abstract class Handler
   {
       //次の処理者を保持します
       private Handler hadNext;
       public Handler HandlerNext
       {
           set{this.hadNext=value;}
           get{return this.hadNext;}
       }
       //次の処理者に処理を委ねる
       public abstract void HandleRequest(PersonalComputer PC);
   }

   //具象処理者クラス
   //電源担当の処理者
   public class ConcreteHandle_PowerSwitch : Handler
   {
       public override void HandleRequest(PersonalComputer PC)
       {
           if(!PC.CheckTest())
           {
               PC.PowerSwitch="正常";
               Console.WriteLine("電源修理完了");
               //PC動作の再テストチェック
               if (!PC.CheckTest())
               {
                   if(this.HandlerNext!=null)
                   {
                       this.HandlerNext.HandleRequest(PC);
                   }
               }
           }
       }
   }

   //具象処理者クラス
   //ハードディスク担当の処理者
   public class ConcreteHandle_HardDisk : Handler
   {
       public override void HandleRequest(PersonalComputer PC)
       {
           if(!PC.CheckTest())
           {
               PC.HardDisk="正常";
               Console.WriteLine("ハードディスク修理完了");

               //PC動作の再テストチェック
               if (!PC.CheckTest())
               {
                   if(this.HandlerNext !=null)
                   {
                       this.HandlerNext.HandleRequest(PC);
                   }
               }
           }
       }
   }

   //具象処理者クラス
   //CPU担当の処理者
   public class ConcreteHandle_CPU : Handler
   {
       public override void HandleRequest(PersonalComputer PC)
       {
           if(!PC.CheckTest())
           {
               PC.CPU="正常";
               Console.WriteLine("CPU修理完了");
               //PC動作の再テストチェック
               if (!PC.CheckTest())
               {
                   if(this.HandlerNext !=null)
                   {
                       this.HandlerNext.HandleRequest(PC);
                   }
               }
           }
       }
   }

   //今回処理対象としたオブジェクト例
   //パソコンクラス
   public class PersonalComputer
   {
       private string strPowerSwitch;
       private string strHardDisk;
       private string strCPU;

       public PersonalComputer(string strPowerSwitch,string strHardDisk,string strCPU)
       {
           this.strPowerSwitch =strPowerSwitch;
           this.strHardDisk    =strHardDisk;
           this.strCPU         =strCPU;
       }

       //電源スイッチの属性
       public string PowerSwitch
       {
           set{this.strPowerSwitch=value;}
           get{return this.strPowerSwitch;}
       }
       //ハードディスクの属性
       public string HardDisk
       {
           set{this.strHardDisk=value;}
           get{return this.strHardDisk;}
       }
       //CPUの属性
       public string CPU
       {
           set{this.strCPU=value;}
           get{return this.strCPU;}
       }

       //動作確認メソッド(戻り値 true:全て正常,false;一部に異常がある)
       public bool CheckTest()
       {
           if (this.strPowerSwitch !="正常")
           {
               return false;
           }
           else if(this.strHardDisk !="正常")
           {
               return false;
           }
           else if(this.strCPU !="正常")
           {
               return false;
           }
           else
           {
               Console.WriteLine("このPCはすべて正常です。");
               return true;
           }
       }
   }

   /// <summary>
   /// Class1 の概要の説明です。
   /// </summary>
   class Class1
   {
       /// <summary>
       /// アプリケーションのメイン エントリ ポイントです。
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {
           //壊れたPCの定義
           PersonalComputer BrokenPC=new PersonalComputer("正常","正常","壊れています");

           //処理者のインスタンス生成
           //電源担当
           Handler h_PS    =new ConcreteHandle_PowerSwitch();
           //ハードディスク担当
           Handler h_HD    =new ConcreteHandle_HardDisk();
           //CPU担当
           Handler h_CPU   =new ConcreteHandle_CPU();

           //次の「処理者」を登録
           h_PS.HandlerNext=h_HD;
           h_HD.HandlerNext=h_CPU;

           //処理者を呼び出し実行する
           h_PS.HandleRequest(BrokenPC);

           //-----------------------------------------------------
           //協調関係について
           //クライアントはHandlerに処理を依頼します。Handler
           //での処理が未達成の場合、あるいは処理が出来ない場合は、
           //親のHandlerの鎖をたどって実行します。
           //クライアントが処理者に要求を出す時や具象処理者が次の処理を
           //引き渡す時にはHandlerで定義されたインターフェースを通して
           //アクセスします。
           //-----------------------------------------------------

           //-----------------------------------------------------
           //ポイント(クライアントと処理オブジェクトの疎な関係で変更
           //          にも最小限の修正を考える)
           //
           //クライアント(要求を出すオブジェクト)と実際に処理する
           //具象オブジェクトの関係が疎になることが重要です。
           //クライアントは最初の具象処理者に処理を依頼するだけで次の
           //処理は、親で登録されたオブジェクトをたどって、次々と処理
           //されていきます。
           //このパターンを使用しない場合は、クライアントが処理オブジェクト
           //を全て把握して使用することになり、処理するオブジェクトが変更
           //した場合、クライアントの要求側も変更が必要となります。
           //-----------------------------------------------------
       }
   }
}

Chain Of Responsibility 実行結果

Chain Of Responsibility fig

UMLプラグインによる描画 Chain of Responsibilityパターン

Javaソースコード Chain of Responsibilityパターン

Handler.java
   1: package chainOfResponsibility;
   2: 
   3: public abstract class Handler {
   4: 
   5: 
   6:     private Handler handler;
   7: 
   8:     //次の処理者に処理を依頼する
   9:     public abstract void HandlerRequest(PersonalComputer personalComputer);
  10: 
  11:     public Handler getHandler() {
  12:         return handler;
  13:     }
  14: 
  15:     public void setHandler(Handler handler) {
  16:         this.handler = handler;
  17:     }
  18: 
  19: }
ConcreteHandler_PowerSwitch.java
   1: package chainOfResponsibility;
   2: 
   3: public class ConcreteHandler_PowerSwitch extends Handler {
   4: 
   5:     public void HandlerRequest(PersonalComputer personalComputer) {
   6:         //パソコンに異常があるかどうかチェックする
   7:         if(!personalComputer.CheckTest()){
   8:             //電源の修理をする
   9:             personalComputer.setPowerSwitch("正常");
  10:             System.out.println("電源修理完了");
  11:             //再度チェックする
  12:             if(!personalComputer.CheckTest()){
  13:                 //異常がある場合次の処理者に処理を委ねる
  14:                 if(this.getHandler() !=null){
  15:                     this.getHandler().HandlerRequest(personalComputer);
  16:                 }
  17:             }
  18:         }
  19:     }
  20: }
ConcreteHandler_HardDisk.java
   1: package chainOfResponsibility;
   2: 
   3: public class ConcreteHandler_HardDisk extends Handler {
   4: 
   5:     public void HandlerRequest(PersonalComputer personalComputer) {
   6:         //パソコンに異常があるかどうかチェックする
   7:         if(!personalComputer.CheckTest()){
   8:             //ハードディスクの修理をする
   9:             personalComputer.setHardDisk("正常");
  10:             System.out.println("ハードディスク修理完了");
  11:             //再度チェックする
  12:             if(!personalComputer.CheckTest()){
  13:                 //異常がある場合次の処理者に処理を委ねる
  14:                 if(this.getHandler() !=null){
  15:                     this.getHandler().HandlerRequest(personalComputer);
  16:                 }
  17:             }
  18:         }
  19:     }
  20: }
ConcreteHandler_CPU.java
   1: package chainOfResponsibility;
   2: 
   3: public class ConcreteHandler_CPU extends Handler {
   4: 
   5:     public void HandlerRequest(PersonalComputer personalComputer) {
   6:         //パソコンに異常があるかどうかチェックする
   7:         if(!personalComputer.CheckTest()){
   8:             //CPUの修理をする
   9:             personalComputer.setCPU("正常");
  10:             System.out.println("CPU修理完了");
  11:             //再度チェックする
  12:             if(!personalComputer.CheckTest()){
  13:                 //異常がある場合次の処理者に処理を委ねる
  14:                 if(this.getHandler() !=null){
  15:                 this.getHandler().HandlerRequest(personalComputer);
  16:                 }
  17:             }
  18:         }    
  19:     }
  20: }
PersonalComputer.java
   1: package chainOfResponsibility;
   2: 
   3: public class PersonalComputer {
   4: 
   5:     private String PowerSwitch;
   6: 
   7:     private String HardDisk;
   8: 
   9:     private String CPU;
  10: 
  11:     public String getPowerSwitch() {
  12:         return PowerSwitch;
  13:     }
  14: 
  15:     public void setPowerSwitch(String PowerSwitch) {
  16:         this.PowerSwitch = PowerSwitch;
  17:     }
  18: 
  19:     public String getHardDisk() {
  20:         return HardDisk;
  21:     }
  22: 
  23:     public void setHardDisk(String HardDisk) {
  24:         this.HardDisk = HardDisk;
  25:     }
  26: 
  27:     public String getCPU() {
  28:         return CPU;
  29:     }
  30: 
  31:     public void setCPU(String CPU) {
  32:         this.CPU = CPU;
  33:     }
  34: 
  35:     public PersonalComputer(
  36:         String strPowerSwitch,
  37:         String strHardDisk,
  38:         String strCPU) {
  39:             //属性については、初回のコンストラクタでセットします
  40:             this.PowerSwitch=strPowerSwitch;
  41:             this.HardDisk =strHardDisk;
  42:             this.CPU=strCPU;
  43:     }
  44: 
  45:     //パソコンの動作確認メソッド
  46:     //戻り値(true:全て正常 false:一部に異常がある)
  47:     public boolean CheckTest() {
  48:         
  49:         //各部品をチェック
  50:         if(this.PowerSwitch !="正常"){
  51:             return false;
  52:         }else if(this.HardDisk !="正常"){
  53:             return false;
  54:         }else if(this.CPU !="正常"){
  55:             return false;
  56:         }else{
  57:             System.out.println("このPCはすべて正常です。");
  58:             return true;
  59:         }
  60:     }
  61: }
StartClass.java
   1: package chainOfResponsibility;
   2: 
   3: public class StartClass {
   4: 
   5:     public static void main(String[] args) {
   6:         //壊れたPCの定義
   7:         PersonalComputer brokenPC =new PersonalComputer("正常","正常","CPU壊れています。");
   8:         //3つの処理者インスタンス生成します。
   9:         Handler h_PowerSwitch     =new ConcreteHandler_PowerSwitch();
  10:         Handler h_HardDisk         =new ConcreteHandler_HardDisk();
  11:         Handler h_CPU            =new ConcreteHandler_CPU();
  12:         //次の処理者を設定
  13:         h_PowerSwitch.setHandler(h_HardDisk);
  14:         h_HardDisk.setHandler(h_CPU);
  15:         
  16:         //パワースイッチ担当から処理を実行する
  17:         h_PowerSwitch.HandlerRequest(brokenPC);
  18:     }
  19: }



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

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

お天気情報
東京都 東京 - 今日の天気
曇り - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2012/02/05 17:00:00  ST: True
東京都 東京 - 明日の天気
晴のち雨 - リンク先
最高 最低
気温 9 3
湿度 48.2 37.4
取得日:2012/02/05 17:00:00  ST: True
東京都 東京 - あさっての天気
晴時々曇 - リンク先
最高 最低
気温 11 4
湿度 51.8 39.2
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - 今日の天気
晴のち曇 - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - 明日の天気
- リンク先
最高 最低
気温 11 5
湿度 51.8 41
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - あさっての天気
曇時々晴 - リンク先
最高 最低
気温 7 3
湿度 44.6 37.4
取得日:2012/02/05 17:00:00  ST: True
livedoorのWebサービスより提供
【工事中】お天気配信 ユーザー登録
rarestyle
Copyright 2006 Rarestyle このページへのリンクは確認不要です。
Programming by Xenon Project Team     postmaster@rarestyle.net
免責事項について
レアスタイルサイト内検索