设计模式C++描述__职责链(Chain of Responsibility)模式
来源:互联网 发布:网络社交平台有哪些 编辑:程序博客网 时间:2024/05/11 12:04
其他模式链接地址:点击打开链接
一. 概述
职责链模式:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
二. 举个例子
员工要求加薪
公司的管理者一共有三级:总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。
结构图如下:
假设:
经理可以处理薪水的范围在:0~500
总监可以处理薪水的范围在:500~1000
总经理可以处理薪水的范围在:1000~2000
则代码如下:
[cpp] //////////////////////////////////////////////////////////////////////////
//抽象处理类
class Handle
{
public:
virtual ~Handle()
{
delete _succ;
}
virtual void HandleRequest(int request) = 0;
//设置其上级
void SetSuccessor(Handle* succ)
{
_succ = succ;
}
Handle* GetSuccessor()
{
return _succ;
}
protected:
Handle()
{
_succ = NULL;
}
private:
Handle* _succ;
};
//具体处理类 A
class ConcreteHandleA: public Handle
{
public:
void HandleRequest(int request)
{
if (request >= 0 && request < 500)
{
cout << "ConcreteHandleA deal with: " << request <<endl;
}
else if (this->GetSuccessor() != NULL)
{
this->GetSuccessor()->HandleRequest(request);
}
else
{
cout << "Can't deal with " << request << endl;
}
}
};
//具体处理类 B
class ConcreteHandleB: public Handle
{
public:
void HandleRequest(int request)
{
if (request >= 500 && request < 1000)
{
cout << "ConcreteHandleB deal with: " << request <<endl;
}
else if (this->GetSuccessor() != NULL)
{
this->GetSuccessor()->HandleRequest(request);
}
else
{
cout << "Can't deal with " << request << endl;
}
}
};
//具体处理类 C
class ConcreteHandleC: public Handle
{
public:
void HandleRequest(int request)
{
if (request >= 1000 && request < 2000)
{
cout << "ConcreteHandleC deal with: " << request <<endl;
}
else if (this->GetSuccessor() != NULL)
{
this->GetSuccessor()->HandleRequest(request);
}
else
{
cout << "Can't deal with " << request << endl;
}
}
};
//////////////////////////////////////////////////////////////////////////
//测试
int main()
{
Handle* h1 = new ConcreteHandleA();
Handle* h2 = new ConcreteHandleB();
Handle* h3 = new ConcreteHandleC();
//设置其上级
h1->SetSuccessor(h2);
h2->SetSuccessor(h3);
h1->HandleRequest(300);
h1->HandleRequest(600);
h1->HandleRequest(1500);
h1->HandleRequest(3000);
delete h1;
delete h2;
delete h3;
return 0;
}
//////////////////////////////////////////////////////////////////////////
//抽象处理类
class Handle
{
public:
virtual ~Handle()
{
delete _succ;
}
virtual void HandleRequest(int request) = 0;
//设置其上级 www.2cto.com
void SetSuccessor(Handle* succ)
{
_succ = succ;
}
Handle* GetSuccessor()
{
return _succ;
}
protected:
Handle()
{
_succ = NULL;
}
private:
Handle* _succ;
};
//具体处理类 A
class ConcreteHandleA: public Handle
{
public:
void HandleRequest(int request)
{
if (request >= 0 && request < 500)
{
cout << "ConcreteHandleA deal with: " << request <<endl;
}
else if (this->GetSuccessor() != NULL)
{
this->GetSuccessor()->HandleRequest(request);
}
else
{
cout << "Can't deal with " << request << endl;
}
}
};
//具体处理类 B
class ConcreteHandleB: public Handle
{
public:
void HandleRequest(int request)
{
if (request >= 500 && request < 1000)
{
cout << "ConcreteHandleB deal with: " << request <<endl;
}
else if (this->GetSuccessor() != NULL)
{
this->GetSuccessor()->HandleRequest(request);
}
else
{
cout << "Can't deal with " << request << endl;
}
}
};
//具体处理类 C
class ConcreteHandleC: public Handle
{
public:
void HandleRequest(int request)
{
if (request >= 1000 && request < 2000)
{
cout << "ConcreteHandleC deal with: " << request <<endl;
}
else if (this->GetSuccessor() != NULL)
{
this->GetSuccessor()->HandleRequest(request);
}
else
{
cout << "Can't deal with " << request << endl;
}
}
};
//////////////////////////////////////////////////////////////////////////
//测试
int main()
{
Handle* h1 = new ConcreteHandleA();
Handle* h2 = new ConcreteHandleB();
Handle* h3 = new ConcreteHandleC();
//设置其上级
h1->SetSuccessor(h2);
h2->SetSuccessor(h3);
h1->HandleRequest(300);
h1->HandleRequest(600);
h1->HandleRequest(1500);
h1->HandleRequest(3000);
delete h1;
delete h2;
delete h3;
return 0;
}
三. 说明
1. 职责链的特点是:当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。
2. 职责链的好处是:请求者不用管哪个对象来处理,反正该请求会被处理。它只需保持一个后继者即可。
3. 要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当。
作者 lwbeyond
- 设计模式C++描述__职责链(Chain of Responsibility)模式
- Chain of Responsibility(职责链设计模式)
- 设计模式C++描述----05.职责链(Chain of Responsibility)模式
- 设计模式C++描述----05.职责链(Chain of Responsibility)模式
- 设计模式(15)-职责链模式(Chain of Responsibility)
- 设计模式之Chain of Responsibility职责链模式
- 设计模式----Chain of Responsibility(职责链)模式
- 设计模式系列随笔- Chain Of Responsibility 职责链模式
- Java设计模式-----Chain of Responsibility职责链模式
- 设计模式—Chain of Responsibility职责链模式
- 设计模式(17)-职责链模式(Chain of Responsibility)
- 设计模式读书笔记之职责链模式(chain of responsibility)
- 设计模式之职责链模式(Chain of Responsibility )
- 设计模式:职责链模式(Chain of Responsibility)
- Java设计模式-----Chain of Responsibility职责链模式
- 设计模式-职责链模式(chain of Responsibility)
- 【设计模式】之 Chain of Responsibility 职责链模式
- JAVA设计模式十一--Chain of Responsibility(职责链模式)
- Java基础之面向对象(抽象类、接口、内部类)
- Android 属性系统(SystemProperties)
- MATLAB常用日期和时间函数
- java写的Socket客户端和服务端通信,经验证可以执行的代码,并添加了很多注释
- oracle 物化视图 -循序渐进MView(三) 基于ROWID的MView
- 设计模式C++描述__职责链(Chain of Responsibility)模式
- CSDN积分
- linux socket通信编程之c语言(客户端和服务器程序)
- Android的日志信息介绍
- unity3d开发的android应用中加入AD系统的具体步骤
- 启动resin多个实例
- 进程与线程的一个简单解释
- fzu_1894 志願者選拔( 單調隊列 )
- cocos2d-x之CCGUI设计与实现(2)RichTextBox的实现(支持多颜色、表情、超链接)