软件领域中的设计模式的重要性不言而喻。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态。虽然知道这些特性的定义但是并没有做到真正的理解,这样特性有什么作用?用于什么场合中等等问题,带着疑问开始学习设计模式,主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。
责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理为止。
责任链很好理解就是基类和不同子类组成的“链”式结构;
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//请求
class Request
{
public:
string m_strContent;
int m_nNumber;
string requestType;
};
//管理者
class Manager
{
protected:
Manager* manager;
string name;
public:
Manager(string temp)
{
name = temp;
}
void SetSuccessor(Manager* temp)
{
manager = temp;
}
virtual void GetRequest(Request* request) = 0;
};
//经理
class CommonManager : public Manager
{
public:
CommonManager(string strTemp) : Manager(strTemp){}
virtual void GetRequest(Request* request)
{
if (request->requestType=="请假" && request->m_nNumber<10)
{
cout << name << " 请假" << request->m_nNumber << " 天" << endl;
}
else
{
manager->GetRequest(request);
}
}
};
//总监
class MajorDomo : public Manager
{
public:
MajorDomo(string name) : Manager(name){}
virtual void GetRequest(Request* request)
{
if (request->requestType == "请假" && request->m_nNumber >= 10)
{
cout << name << " 请假" << request->m_nNumber << " 天" << endl;
}
}
};
//客户端
int main()
{
Manager * common = new CommonManager("张经理");
Manager * major = new MajorDomo("李总监");
common->SetSuccessor(major);
Request* req = new Request();
req->requestType = "请假";
req->m_nNumber = 33;
common->GetRequest(req);
req->m_nNumber = 3;
common->GetRequest(req);
return 0;
}