我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
2015-06-07 08:28
1046 查看
责任链模式是面向对象中的一种软件设计模式,它包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法。
这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
样例:
[cpp]
view plaincopyprint?
#include <iostream>
#include <string>
using namespace std;
// 请求
class Request
{
public:
int m_nNumber;
};
// 管理者
class Manager
{
public:
Manager(string temp) { name = temp; }
void SetSuccessor(Manager* temp) { manager = temp; }
virtual void GetRequest(Request* request) = 0;
protected:
Manager* manager;
string name;
};
// 经理
class CommonManager : public Manager
{
public:
CommonManager(string strTemp) : Manager(strTemp) {}
virtual void GetRequest(Request* request);
};
void CommonManager::GetRequest(Request* request)
{
if (request->m_nNumber>=0 && request->m_nNumber<1000)
{
cout << name << " 处理了请求: " << request->m_nNumber << endl;
}
else
{
manager->GetRequest(request);
}
}
// 总监
class Majordomo : public Manager
{
public:
Majordomo(string strTemp) : Manager(strTemp) {}
virtual void GetRequest(Request* request);
};
void Majordomo::GetRequest(Request* request)
{
if (request->m_nNumber <= 5000)
{
cout << name << " 处理了请求: " << request->m_nNumber << endl;
}else
{
manager->GetRequest(request);
}
}
//总经理
class GeneralManager: public Manager
{
public:
GeneralManager(string name):Manager(name) {}
virtual void GetRequest(Request* request) //总经理可以处理所有请求
{
cout << name << " 处理了请求: " << request->m_nNumber << endl;
}
};
int main(){
Manager* common = new CommonManager("张经理");
Manager* major = new Majordomo("李总监");
GeneralManager* general = new GeneralManager("赵总");
common->SetSuccessor(major);
major->SetSuccessor(general);
Request* rq = new Request();
rq->m_nNumber = 999;
common->GetRequest(rq);
rq->m_nNumber = 4999;
common->GetRequest(rq);
rq->m_nNumber = 6999;
common->GetRequest(rq);
delete rq;
delete major;
delete common;
delete general;
return 0;
}
2.责任链模式并不创建责任链。责任链的创建必须由系统的其它部分创建出来。
3.责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。一个链可以是一条线,一个树,也可以是一个环。如下图所示,责任链是一个树结构的一部分。
LCL_data原创于CSDN.NET【/article/1352947.html】
看到这里的各位加薪申请都是general批... :-))
责任链模式是面向对象中的一种软件设计模式,它包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法。
概述:
辛辛苦苦了工作了一年,终于可以加薪了,向主管提交了加薪申请,主管一看不得了,自己职权不够,批不了,主管把申请上交总监,总监发现自己也批不了,申请到了总经理手中,总经理一看,小伙子口气不小了,有胆识敢申请,先来谈下心。预知后事如何,请看下回分解。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
类图与实例:
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
样例:
[cpp]
view plaincopyprint?
#include <iostream>
#include <string>
using namespace std;
// 请求
class Request
{
public:
int m_nNumber;
};
// 管理者
class Manager
{
public:
Manager(string temp) { name = temp; }
void SetSuccessor(Manager* temp) { manager = temp; }
virtual void GetRequest(Request* request) = 0;
protected:
Manager* manager;
string name;
};
// 经理
class CommonManager : public Manager
{
public:
CommonManager(string strTemp) : Manager(strTemp) {}
virtual void GetRequest(Request* request);
};
void CommonManager::GetRequest(Request* request)
{
if (request->m_nNumber>=0 && request->m_nNumber<1000)
{
cout << name << " 处理了请求: " << request->m_nNumber << endl;
}
else
{
manager->GetRequest(request);
}
}
// 总监
class Majordomo : public Manager
{
public:
Majordomo(string strTemp) : Manager(strTemp) {}
virtual void GetRequest(Request* request);
};
void Majordomo::GetRequest(Request* request)
{
if (request->m_nNumber <= 5000)
{
cout << name << " 处理了请求: " << request->m_nNumber << endl;
}else
{
manager->GetRequest(request);
}
}
//总经理
class GeneralManager: public Manager
{
public:
GeneralManager(string name):Manager(name) {}
virtual void GetRequest(Request* request) //总经理可以处理所有请求
{
cout << name << " 处理了请求: " << request->m_nNumber << endl;
}
};
int main(){
Manager* common = new CommonManager("张经理");
Manager* major = new Majordomo("李总监");
GeneralManager* general = new GeneralManager("赵总");
common->SetSuccessor(major);
major->SetSuccessor(general);
Request* rq = new Request();
rq->m_nNumber = 999;
common->GetRequest(rq);
rq->m_nNumber = 4999;
common->GetRequest(rq);
rq->m_nNumber = 6999;
common->GetRequest(rq);
delete rq;
delete major;
delete common;
delete general;
return 0;
}
#include <iostream> #include <string> using namespace std; // 请求 class Request { public: int m_nNumber; }; // 管理者 class Manager { public: Manager(string temp) { name = temp; } void SetSuccessor(Manager* temp) { manager = temp; } virtual void GetRequest(Request* request) = 0; protected: Manager* manager; string name; }; // 经理 class CommonManager : public Manager { public: CommonManager(string strTemp) : Manager(strTemp) {} virtual void GetRequest(Request* request); }; void CommonManager::GetRequest(Request* request) { if (request->m_nNumber>=0 && request->m_nNumber<1000) { cout << name << " 处理了请求: " << request->m_nNumber << endl; } else { manager->GetRequest(request); } } // 总监 class Majordomo : public Manager { public: Majordomo(string strTemp) : Manager(strTemp) {} virtual void GetRequest(Request* request); }; void Majordomo::GetRequest(Request* request) { if (request->m_nNumber <= 5000) { cout << name << " 处理了请求: " << request->m_nNumber << endl; }else { manager->GetRequest(request); } } //总经理 class GeneralManager: public Manager { public: GeneralManager(string name):Manager(name) {} virtual void GetRequest(Request* request) //总经理可以处理所有请求 { cout << name << " 处理了请求: " << request->m_nNumber << endl; } }; int main(){ Manager* common = new CommonManager("张经理"); Manager* major = new Majordomo("李总监"); GeneralManager* general = new GeneralManager("赵总"); common->SetSuccessor(major); major->SetSuccessor(general); Request* rq = new Request(); rq->m_nNumber = 999; common->GetRequest(rq); rq->m_nNumber = 4999; common->GetRequest(rq); rq->m_nNumber = 6999; common->GetRequest(rq); delete rq; delete major; delete common; delete general; return 0; }
要点与实现:
1.要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当.2.责任链模式并不创建责任链。责任链的创建必须由系统的其它部分创建出来。
3.责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。一个链可以是一条线,一个树,也可以是一个环。如下图所示,责任链是一个树结构的一部分。
LCL_data原创于CSDN.NET【/article/1352947.html】
看到这里的各位加薪申请都是general批... :-))
相关文章推荐
- VC++中的NULL_PEN和NULL_BRUSH
- C++ AfxBeginThread的介绍/基本用法
- VS2010 VC++创建.rc资源文件
- 【C++】复数的运算符重载
- C++ 虚函数经典深入解析 (good)
- C语言实现一个泛型容器
- C语言实现一个泛型容器
- C语言实现一个泛型容器
- C语言实现一个泛型容器
- 关于C++函数思考1(缺省的六大函数)
- 【C++缺省函数】 空类默认产生的6个类成员函数
- C++11 的右值引用(Rvalue reference)——细微却最重要的改动
- /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15
- 好文摘抄 [C语言]关于指针和int型的一道题目
- C++ 画星号图形——圆形(核心代码记录)
- C++ 画星号图形——空心三角形(星号左对齐)(核心代码介绍)
- C++ 画星号图形——空心三角形(星号居中对齐)(核心代码介绍)
- C++ 画星号图形——空心正方形(核心代码)
- C语言获取当前工作路径
- MFC六大关键技术之仿真学习笔记(七)