轉(zhuǎn):
http://www.shnenglu.com/converse/archive/2006/07/28/10663.html作用:
使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系.將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止.
UML結(jié)構(gòu)圖:

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

/**//********************************************************************
created: 2006/07/20
filename: ChainOfResponsibility.h
author: 李創(chuàng)
http://www.shnenglu.com/converse/

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

#ifndef CHAINOFRESPONSIBILITY_H
#define CHAINOFRESPONSIBILITY_H

#include <stdio.h>

// 抽象基類,定義一個(gè)處理請(qǐng)求的接口
class Handler


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

// 純虛函數(shù),由派生類實(shí)現(xiàn)
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: 李創(chuàng)
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: 李創(chuàng)
http://www.shnenglu.com/converse/

purpose: ChainOfResponsibility模式的測(cè)試代碼
*********************************************************************/

#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;
}
posted on 2011-08-05 01:46
小王 閱讀(312)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
設(shè)計(jì)模式