// ChainofResponsibilityPattern.cpp : 定义控制台应用程序的入口点。
RES: http://blog.youkuaiyun.com/wuzhekai1985/article/details/6673892
//通过此例程了解“职责链模式”
// 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。其思想很简单,考虑员工要求加薪。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求
RES: http://blog.youkuaiyun.com/wuzhekai1985/article/details/6673892
#include "stdafx.h"
#include <string>
#include <process.h>
#include <iostream>
using namespace std;
//经理接口类
class CManager
{
public:
CManager(CManager *pManager,string name)
{
this->m_pManager=pManager;
this->m_name=name;
}
virtual ~CManager()
{
}
public:
virtual void DealWithRequest(string name,int num)
{
}
protected:
CManager *m_pManager;
string m_name;
};
//经理
class CCommonManager:public CManager
{
public:
CCommonManager(CManager *pManager,string name):CManager(pManager,name)
{
}
~CCommonManager()
{
}
public:
void DealWithRequest(string name,int num)
{
if(num < 500) //经理职权之内
{
cout<<"经理"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;
}
else
{
cout<<"经理"<<m_name<<"无法处理,交由总监处理"<<endl;
m_pManager->DealWithRequest(name, num);
}
}
};
//总监
class Majordomo: public CManager
{
public:
Majordomo(CManager *manager, string name):CManager(manager,name) {}
void DealWithRequest(string name, int num)
{
if(num < 1000) //总监职权之内
{
cout<<"总监"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;
}
else
{
cout<<"总监"<<m_name<<"无法处理,交由总经理处理"<<endl;
m_pManager->DealWithRequest(name, num);
}
}
};
//总经理
class GeneralManager: public CManager
{
public:
GeneralManager(CManager *manager, string name):CManager(manager,name) {}
void DealWithRequest(string name, int num) //总经理可以处理所有请求
{
cout<<"总经理"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CManager *general = new GeneralManager(NULL, "A"); //设置上级,总经理没有上级
CManager *majordomo = new Majordomo(general, "B"); //设置上级
CManager *common = new CCommonManager(majordomo, "C"); //设置上级
cout<<"---------------员工D要求加薪300员,处理中-------------"<<endl<<endl;
common->DealWithRequest("D",300); //员工D要求加薪
cout<<"------------员工E要求加薪600员,处理中----------------"<<endl<<endl;
common->DealWithRequest("E", 600);
cout<<"--------------员工F要求加薪1000员,处理中---------------"<<endl<<endl;
common->DealWithRequest("F", 1000);
delete common;
delete majordomo;
delete general;
system("pause");
return 0;
}