作用:
使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系.將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止.
UML結構圖:

抽象基類:
1)Handler:定義一個處理請求的接口,在圖中這個接口就是HandleRequset函數,這個類同時有一個指向Handler對象的指針,指向后續的處理請求的對象(如果有的話).
解析:
這個模式把可以處理一個請求的對象以鏈的形式連在了一起,讓這些對象都有處理請求的機會.好比原來看古裝電視中經常看到皇宮中召見某人的時候,太監們(可以處理一個請求的對象)就會依次的喊:傳XX...這樣一直下去直到找到這個人為止.ChainOfResponsibility模式也是這樣的處理請求的,如果有后續的對象可以處理,那么傳給后續的對象處理,否則就自己處理請求.這樣的設計把請求的發送者和請求這種的處理者解耦了,好比發號的皇帝不知道到底是哪個太監最后會找到他要找到的人一般,只管發出命令就OK了.
實現:
1)ChainOfResponsibility.h

/**//********************************************************************
????created:????2006/07/20
????filename:?????ChainOfResponsibility.h
????author:????????李創
????????????????http://www.shnenglu.com/converse/

????purpose:????ChainOfResponsibility模式的演示代碼
*********************************************************************/

#ifndef?CHAINOFRESPONSIBILITY_H
#define?CHAINOFRESPONSIBILITY_H

#include?<stdio.h>

//?抽象基類,定義一個處理請求的接口
class?Handler


{
public:
????Handler(Handler?*pSuccessor?=?NULL);
????virtual?~Handler();

????//?純虛函數,由派生類實現
????virtual?void?HandleRequset()?=?0;

protected:
????Handler*?m_pSuccessor;
};

class?ConcreateHandler1
????:?public?Handler


{
public:

????ConcreateHandler1(Handler?*pSuccessor?=?NULL)?:?Handler(pSuccessor)
{}

????virtual?~ConcreateHandler1()
{}

????virtual?void?HandleRequset();
};

class?ConcreateHandler2
????:?public?Handler


{
public:

????ConcreateHandler2(Handler?*pSuccessor?=?NULL)?:?Handler(pSuccessor)
{}

????virtual?~ConcreateHandler2()
{}

????virtual?void?HandleRequset();
};

#endif

2)ChainOfResponsibility.cpp

/**//********************************************************************
????created:????2006/07/20
????filename:?????ChainOfResponsibility.cpp
????author:????????李創
????????????????http://www.shnenglu.com/converse/

????purpose:????ChainOfResponsibility模式的演示代碼
*********************************************************************/

#include?"ChainOfResponsibility.h"
#include?<iostream>


Handler::Handler(Handler?*pSuccessor?/**//*?=?NULL*/)?
????:?m_pSuccessor(pSuccessor)


{
}

Handler::~Handler()


{
????delete?m_pSuccessor;
????m_pSuccessor?=?NULL;
}

void?ConcreateHandler1::HandleRequset()


{
????if?(NULL?!=?m_pSuccessor)

????
{
????????m_pSuccessor->HandleRequset();
????}
????else

????
{
????????std::cout?<<?"HandleRequset?by?ConcreateHandler1\n";
????}
}

void?ConcreateHandler2::HandleRequset()


{
????if?(NULL?!=?m_pSuccessor)

????
{
????????m_pSuccessor->HandleRequset();
????}
????else

????
{
????????std::cout?<<?"HandleRequset?by?ConcreateHandler2\n";
????}
}


3)Main.cpp

/**//********************************************************************
????created:????2006/07/20
????filename:?????Main.cpp
????author:????????李創
????????????????http://www.shnenglu.com/converse/

????purpose:????ChainOfResponsibility模式的測試代碼
*********************************************************************/

#include?"ChainOfResponsibility.h"
#include?<stdlib.h>

int?main()


{
????Handler?*p1?=?new?ConcreateHandler1();
????Handler?*p2?=?new?ConcreateHandler2(p1);

????p2->HandleRequset();

????delete?p2;

????system("pause");

????return?0;
}
