C++设计模式--职责链模式

来源:互联网 发布:查找英文文献的数据库 编辑:程序博客网 时间:2024/06/06 09:29
 // ChainofResponsibilityPattern.cpp : 定义控制台应用程序的入口点。

//通过此例程了解“职责链模式”


// 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。其思想很简单,考虑员工要求加薪。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求



RES:http://blog.csdn.net/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;}




原创粉丝点击