设计模式(c++)笔记之二十一(Chain of Responsibility模式)

一、描述:


      概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。


      Chain of Responsibility 模式典型的结构图为: 




      Chain of Responsibility模式中ConcreteHandler将自己的后继对象(向下传递消息的对象)记录在自己的后继表中,当一个请求到来时,ConcreteHandler 会先检查看自己有没有匹配的处理程序,如果有就自己处理,否则传递给它的后继。当然这里示例程序中为了简化,ConcreteHandler 只是简单的检查看自己有没有后继,有的话将请求传递给后继进行处理,没有的话就自己处理。 


二、实例:


      中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父、既嫁从夫、夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的,举个例子来说,一个女的要出去逛街,同样这样的一个请求,在她没有出嫁前她必须征得父亲的同意,出嫁之后必须获得丈夫的许可,那丈夫死了怎么办?一般都是男的比女的死的早,还要问问儿子是否允许自己出去逛街,估计你下边马上要问要是没有儿子怎么办?请示小叔子、侄子等等,在父系社会中,妇女只占从属地位,现在想想中国的妇女还是比较悲惨的,逛个街还要请示来请示去,而且作为父亲、丈夫、儿子只有两种选择:要不承担起责任来告诉她允许或不允许逛街,要不就让她请示下一个人,这是整个社会体系的约束,应用到我们项目中就是业务规则,那我们来看怎么把“三从”通过我们的程序来实现,需求很简单:通过程序描述一下古代妇女的“三从”制度,好我们先看类图: 




main(),客户

IWomen,发出请求者接口

CWomen,请求者实现类

CHandler,处理请求抽象类

CFather,处理请求实现类,责任链之一

CHusband,处理请求实现类,责任链之二

CSon,处理请求实现类,责任链之三

说明:CHandler抽象类负责聚合责任链之中的其它处理对象,用SetNext来建立这个责任链。HandleMessage在处理请求时,会判断是否是自己要处理的请求,如果是则直接处理。如果不是,则查找下一个责任链上的处理对象,找到了则由下一个处理。


我的工程目录:


            


发出请求者接口:IWomen类

IWomen.h

#ifndef __Chain_of_Responsibility__IWomen__
#define __Chain_of_Responsibility__IWomen__

#include <iostream>
using std::string;
class IWomen
{
public:
    IWomen(void)
    {
    }
    virtual ~IWomen(void)
    {
    }
    //获得个人状况
    virtual int GetType() = 0;
    
    //获得个人请示,你要干什么?出去逛街?约会?还是看电影
    virtual string GetRequest() = 0;
};


#endif /* defined(__Chain_of_Responsibility__IWomen__) */

请求者实现类:CWomen类

CWomen.h

#ifndef __Chain_of_Responsibility__Women__
#define __Chain_of_Responsibility__Women__

#include <iostream>
#include "IWomen.h"
using std::string;

class CWomen :
public IWomen
{
public:
    CWomen(int _type, string _request);
    ~CWomen(void);
    int GetType();       //获得自己的状况
    string GetRequest(); //获得妇女的请求
private:
    /* 1---未出嫁;2---出嫁;3---夫死*/
    int m_type;
    
    //妇女的请示
    string m_request;
};

#endif /* defined(__Chain_of_Responsibility__Women__) */
CWomen.cpp

#include "Women.h"

CWomen::CWomen( int _type, string _request )
{
    this->m_type = _type;
    switch (this->m_type)
    {
        case 1:
            this->m_request.append("女儿的请求是:");
            this->m_request.append(_request);
            break;
        case 2:
            this->m_request.append("妻子的请求是:");
            this->m_request.append(_request);
            break;
        case 3:
            this->m_request.append("母亲的请求是:");
            this->m_request.append(_request);
            break;
    }
}

CWomen::~CWomen(void)
{
}

int CWomen::GetType()
{
    return m_type;
}

string CWomen::GetRequest()
{
    return m_request;
}

处理请求抽象类: CHandler类

CHandler.h

#ifndef __Chain_of_Responsibility__Handler__
#define __Chain_of_Responsibility__Handler__

#include <iostream>
#include "IWomen.h"

class CHandler
{
public:
    CHandler(int _level);
    virtual ~CHandler(void);
    void HandleMessage(IWomen *pwomen); 
    void SetNext(CHandler *phandler);
    virtual void Response(IWomen *pwomen) = 0;
private:
    int m_level;               //能处理的级别
    CHandler *m_pNextHandler;  //责任传递,下一个人责任人是谁
};

#endif /* defined(__Chain_of_Responsibility__Handler__) */
CHandler.cpp

#include "Handler.h"

using std::cout;
using std::endl;

//每个类都要说明一下自己能处理哪些请求
CHandler::CHandler(int _level ) : m_level(_level)
{
    m_pNextHandler = NULL;
}
CHandler::~CHandler(void)
{
}

//一个女性(女儿,妻子或者是母亲)要求逛街,你要处理这个请求
void CHandler::HandleMessage( IWomen *pwomen )
{
    if (pwomen->GetType() == this->m_level)
    {
        this->Response(pwomen);
    }
    else
    {
        if(this->m_pNextHandler != NULL)
            this->m_pNextHandler->HandleMessage(pwomen);
        else
            cout << "----------没地方请示了,不做处理!----------" << endl;
    }
}

/*
 * 如果你属于你处理的返回,你应该让她找下一个环节的人,比如
 * 女儿出嫁了,还向父亲请示是否可以逛街,那父亲就应该告诉女儿,应该找丈夫请示
 */
void CHandler::SetNext( CHandler *phandler )
{
    m_pNextHandler = phandler;
}

处理请求实现类,责任链之一(父亲): CFather类

CFather.h

#ifndef __Chain_of_Responsibility__Father__
#define __Chain_of_Responsibility__Father__

#include <iostream>
#include "Handler.h"
#include "IWomen.h"

class CFather :
public CHandler
{
public:
    CFather(void);
    ~CFather(void);
    void Response(IWomen *pwomen);
};

#endif /* defined(__Chain_of_Responsibility__Father__) */
CFather.cpp

#include "Father.h"
using std::cout;
using std::endl;

CFather::CFather(void) : CHandler(1)
{
}
CFather::~CFather(void)
{
}

//父亲的答复
void CFather::Response( IWomen *pwomen )
{
    cout << "女儿向父亲请示:" << endl;
    cout << pwomen->GetRequest().c_str() << endl;
    cout << "父亲的答复是:同意" << endl;
}

处理请求实现类,责任链之二(丈夫): CHusband.h

CHusband.h

#ifndef __Chain_of_Responsibility__Husband__
#define __Chain_of_Responsibility__Husband__

#include <iostream>
#include "handler.h"
#include "IWomen.h"

class CHusband :
public CHandler
{
public:
    CHusband(void);
    ~CHusband(void);
    void Response(IWomen *pwomen);
};


#endif /* defined(__Chain_of_Responsibility__Husband__) */
CHusband.cpp

#include "Husband.h"
using std::cout;
using std::endl;

CHusband::CHusband(void) : CHandler(2)
{
}
CHusband::~CHusband(void)
{
}

//丈夫请示的答复
void CHusband::Response( IWomen *pwomen )
{
    cout << "妻子向丈夫请示:" << endl;
    cout << pwomen->GetRequest().c_str() << endl;
    cout << "丈夫的答复是:同意" << endl;
}


处理请求实现类,责任链之三(儿子):CSon类

CSon.h

#ifndef __Chain_of_Responsibility__Son__
#define __Chain_of_Responsibility__Son__

#include <iostream>
#include "handler.h"
#include "IWomen.h"

class CSon :
public CHandler
{
public:
    CSon(void);
    ~CSon(void);
    void Response(IWomen *pwomen);
};


#endif /* defined(__Chain_of_Responsibility__Son__) */
CSon.cpp

#include "Son.h"
using std::cout;
using std::endl;

CSon::CSon(void) : CHandler(3)
{
}
CSon::~CSon(void)
{
}

//儿子的答复
void CSon::Response( IWomen *pwomen )
{
    cout << "母亲向儿子请示:" << endl;
    cout << pwomen->GetRequest().c_str() << endl;
    cout << "儿子的答复是:同意" << endl;
}

客户:main

#include <iostream>
#include "IWomen.h"
#include "Women.h"
#include "Handler.h"
#include "Father.h"
#include "Husband.h"
#include "Son.h"

using std::cout;
using std::endl;

void DoNew()
{
    cout << "----------使用模式后的处理方式----------" << endl;
    //Handler.h, Handler.cpp, IWomen.h, Women.h, Women.cpp, Father.h, Father,cpp, Husband.h, Husband.cpp, Son.h, Son.cpp
    IWomen *pwomen1 = new CWomen(1, "我要出去逛街");    //女儿向父亲请示
    IWomen *pwomen2 = new CWomen(2, "我要出去吃饭");    //已婚少妇,请示丈夫
    IWomen *pwomen3 = new CWomen(3, "我也要出去吃饭");  //母亲请示儿子
    IWomen *pwomen4 = new CWomen(4, "我也要出去逛街");  //暂时啥也不做
    
    CHandler *pfather = new CFather();
    CHandler *phusband = new CHusband();
    CHandler *pson = new CSon();
    
    pfather->SetNext(phusband);
    phusband->SetNext(pson);
    
    pfather->HandleMessage(pwomen1);
    pfather->HandleMessage(pwomen2);
    pfather->HandleMessage(pwomen3);
    pfather->HandleMessage(pwomen4);
    
    delete pfather;
    delete phusband;
    delete pson;
    delete pwomen1;
    delete pwomen2;
    delete pwomen3;
    delete pwomen4;
}

int main(int argc, const char * argv[])
{

    //要实现逻辑判断,即女性的请求先发送到父亲类,父亲类一看是自己要处理的,就回应进行处理。如果女儿已经出嫁了,那就把这个请求转发到女婿类来处理。依此类推,形成了一个责任链。
    DoNew();
    // insert code here...
    std::cout << "Hello, World!\n";
    return 0;
}

结果如下:




参考文献:《设计模式之禅》,《GoF_23种设计模式解析》

参考博客:  http://www.cnblogs.com/wanggary/archive/2011/04/20/2022988.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值