設計模式之 chainofresponsibility

常見設計模式的解析和實現(C++)之十二-ChainOfResponsibility模式

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

UML結構圖:



抽象基類:
1)Handler:定義一個處理請求的接口,在圖中這個接口就是HandleRequset函數,這個類同時有一個指向Handler對象的指針,指向後續的處理請求的對象(如果有的話).

解析:
這個模式把可以處理一個請求的對象以鏈的形式連在了一起,讓這些對象都有處理請求的機會.好比原來看古裝電視中經常看到皇宮中召見某人的時候,太監們(可以處理一個請求的對象)就會依次的喊:傳XX...這樣一直下去直到找到這個人爲止.ChainOfResponsibility模式也是這樣的處理請求的,如果有後續的對象可以處理,那麼傳給後續的對象處理,否則就自己處理請求.這樣的設計把請求的發送者和請求這種的處理者解耦了,好比發號的皇帝不知道到底是哪個太監最後會找到他要找到的人一般,只管發出命令就OK了.

實現:
1)ChainOfResponsibility.h
/********************************************************************
    created:    2006/07/20
    filename:     ChainOfResponsibility.h
    author:        李創
                
http://www.cppblog.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.cppblog.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.cppblog.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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章