|
Rarestyleへようこそ
|
|
|
|
|
|
デザインパターンでキャリアアップ
|
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
{
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("電源修理完了");
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("ハードディスク修理完了");
if
(!PC.CheckTest())
{
if(this.HandlerNext !=null)
{
this.HandlerNext.HandleRequest(PC);
}
}
}
}
}
public class
ConcreteHandle_CPU : Handler
{
public
override void HandleRequest(PersonalComputer
PC)
{
if(!PC.CheckTest())
{
PC.CPU="正常";
Console.WriteLine("CPU修理完了");
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;}
}
public
string CPU
{
set{this.strCPU=value;}
get{return this.strCPU;}
}
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;
}
}
}
class Class1
{
[STAThread]
static
void Main(string[] args)
{
PersonalComputer BrokenPC=new PersonalComputer("正常","正常","壊れています");
Handler h_PS =new ConcreteHandle_PowerSwitch();
Handler h_HD =new ConcreteHandle_HardDisk();
Handler h_CPU =new ConcreteHandle_CPU();
h_PS.HandlerNext=h_HD;
h_HD.HandlerNext=h_CPU;
h_PS.HandleRequest(BrokenPC);
}
}
}
|
Chain Of Responsibility 実行結果
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 |
|
|
大阪府 大阪 - 明日の天気
|
雨
-
|
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
|
大阪府 大阪 - あさっての天気
|
曇時々晴
-
|
|
|
最高
|
最低
|
| 気温
|
7 |
3 |
| 湿度
|
44.6 |
37.4 |
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
| livedoorのWebサービスより提供 |
|
【工事中】お天気配信 ユーザー登録 |
|
|
|
|
|
Internet Explorer5.0以上のご利用を推奨いたします。
|
 |
Copyright 2006 Rarestyle
このページへのリンクは確認不要です。
Programming by Xenon Project Team
postmaster@rarestyle.net
免責事項について
|