设计模式——职责链模式

来源:互联网 发布:卢洁云淘宝店衣服好吗 编辑:程序博客网 时间:2024/04/29 19:17

c++ 职责链模式(Chain of Responsibility)

OSG使用职责链的设计模式,以加载尽量少的插件。

 职 责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 理它为止。其思想很简单,考虑员工要求加薪。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量 在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成 了一条链,直到有一个对象处理请求。给出这个例子的UML图。

复制代码
#include <iostream>#include <string>using namespace std;class Manager{protected:    Manager *m_manager;    string m_name;public:    Manager(Manager* manager,string name):m_manager(manager),m_name(name){}    virtual void DealWithRequest(string name, int num) {}};//经理class CommonManager : public Manager{public:    CommonManager(Manager* manager,string name):Manager(manager,name){}    void DealWithRequest(string name,int num)    {        if(num < 500)        {            cout << "经理" <<m_name << "批准" << name << "加薪" << num << "" <<endl;        }        else        {            cout << "经理" << m_name << "无法处理,交由总监处理" <<endl;            m_manager->DealWithRequest(name,num);        }    }};class Majordomo:public Manager{public:    Majordomo(Manager *manager,string name):Manager(manager,name){}    virtual void DealWithRequest(string name,int num)    {        if(num < 1000)        {            cout << "总监" <<m_name << "批准" << name << "加薪" << num << "" <<endl;        }        else        {            cout << "总监" << m_name << "无法处理,交由总经理处理" <<endl;            m_manager->DealWithRequest(name,num);        }    }};class GeneralManager : public Manager{public:    GeneralManager(Manager *manager,string name):Manager(manager,name){}    void DealWithRequest(string name,int num)    {        cout << "总经理" <<m_name << "批准" << name << "加薪" << num << "" <<endl;    }};
复制代码

客户端使用:

复制代码
#include <iostream>#include "state.h"using namespace std;int main(){    Manager *general = new GeneralManager(NULL,"a");    Manager *majordomo = new Majordomo(general,"b");    Manager *common = new CommonManager(majordomo,"c");    common->DealWithRequest("d",400);    common->DealWithRequest("d",700);    common->DealWithRequest("d",1200);    system("pause");    return 0;}
复制代码

说明:

1. 职责链的特点是:当客户提交一个请求时,请求是沿链传递直至有一个Manager对象负责处理它。

2. 职责链的好处是:请求者不用管哪个对象来处理,反正该请求会被处理。它只需保持一个后继者即可。

3. 要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当。

0 0
原创粉丝点击