最近在看《大话设计模式》这本书,看后感受颇深,现想通过博客的形式将文中所讲到的设计模式用c++语言实现一遍,希望对学习c++和设计模式的朋友有所帮助,同时希望博友们能对代码中有误或者不当的的地方进行指正。
责任链模式--(Chain of Responsibility)
代码如下:
#include <iostream>
#include <stdio.h>
using namespace std;
//请求类 ----(请求类型,请求内容,请求数量)
class Request
{
public:
int Type;
char* Content;
int Num;
public:
void setType(int type){Type=type;}
void setContent(char* content){Content=content;}
void setNum(int num){Num=num;}
};
//抽象管理者类
class Manager
{
protected:
char* name;
Manager* superior;
public:
Manager(char* name1)
{ superior=NULL;
name=name1;
}
void setSuperior(Manager* superior1)
{
this->superior=superior1;
}
virtual void handleRequest(Request* request)
{
}
};
//部门经理
class CommonManager:Manager
{
public:
CommonManager(char* name1):Manager(name1){}; //constructor
void handleRequest(Request* request)
{
if(request->Type == 1 && request->Num<3)
{
cout<<name<<":"<<request->Content<<" be passed"<<endl;
}
else
{
if(superior!=NULL)
{
superior->handleRequest(request);
}
}
}
};
//总监
class MajorDomo:Manager
{
public:
MajorDomo(char* name1):Manager(name1){};
void handleRequest(Request* request)
{
if(request->Type == 1 && request->Num<10)
{
cout<<name<<":"<<request->Content<<" be passed"<<endl;
}
else
{
if(superior!=NULL)
{
superior->handleRequest(request);
}
}
}
};
class GeneralManager:Manager
{
public:
GeneralManager(char* name1):Manager(name1){};
void handleRequest(Request* request)
{
if(request->Type == 1 && request->Num<15)
{
cout<<name<<":"<<request->Content<<" be passed"<<endl;
}
else
{
if(superior!=NULL)
{
superior->handleRequest(request);
}
}
}
};
//客户端调用
int _tmain(int argc, _TCHAR* argv[])
{
Manager* comMan=(Manager*)new CommonManager("xiaozhou");
Manager* majDomo=(Manager*)new MajorDomo("zhongzhou");
Manager* genMan=(Manager*)new GeneralManager("dazhou");
comMan->setSuperior(majDomo);
majDomo->setSuperior(genMan);
Request* request1=new Request();
request1->setType(1);
request1->setContent("mm Qingjia");
request1->setNum(2);
comMan->handleRequest(request1);
Request* request2=new Request();
request2->setType(1);
request2->setContent("gg Qingjia");
request2->setNum(2);
comMan->handleRequest(request2);
delete comMan;
delete majDomo;
delete genMan;
delete request2;
delete request2;
return 0;
}