现在的位置: 首页 > 综合 > 正文

责任链模式

2012年10月26日 ⁄ 综合 ⁄ 共 2420字 ⁄ 字号 评论关闭

//责任链模式
#include <string.h>
class Request
{
private:
 int day;
    string reason;
public:
 Request(int day, string reason)
    {
        this->day = day;
        this->reason = reason;
    }
 int getday()
 {
  return day;
 }
 string getreason()
 {
  return reason;
 }
}; //接下来看下请求相应者,他们有两个核心方法,一个是相应操作,一个是选择继任者。
 class Boss
{
private:
 string name;
protected:
 Boss *successor;
public:
 Boss(string name)
    {
        this->name = name;
    }
 virtual void SetBosssuccessor(Boss * successor)
 {
        this->successor=successor;
 }
    virtual bool PassRequest(Request request)=0;
};
class PM:public Boss
{
public:
 PM(string name): Boss(name) {}
public:
 bool PassRequest(Request request)
    {
        int day = request.getday();
       // string reason = request.getreason();
        if (day <= 0.5)
        {
            return true;
        }
        return successor->PassRequest(request);
    }
};
class HR:public Boss
{
public:
 HR(string name):Boss(name){ }
    bool PassRequest(Request request)
    { 
  int day = request.getday();
       // string reason = request.getreason();
        if (day > 0.5&&day<=2)
        {
            return true;
        }
  if(successor)
        return successor->PassRequest(request);
  return false;
    }
};
class Manager :public Boss
{
public:
 Manager(string name): Boss(name){ }
    bool PassRequest(Request request)
    {
        int day = request.getday();
        string reason = request.getreason();
        if (!reason.compare("正当理由"))
        {
            return true;
        }
        return false;
    }
};

 

//定义一个处理请求的接口,它可以维护一个后继者连接

typedef enum kind
 {
  HELP,
  PRINT
 }KIND;
class HelpHandler {
 friend class Request;
public:
 HelpHandler(){}
 void SetSuccessor(HelpHandler *succ)
 {
  successor=succ;
 }
 virtual ~HelpHandler()
 {
  if(successor)
   delete successor;
 }
 virtual void HandleHelp(Request *theRequest);
 virtual void HandleRequest(Request *theRequest);
private:
 HelpHandler * successor;
};

void HelpHandler::HandleHelp(Request *theRequest)//每个在链上的对象一致的处理请求和链上访问后继者的接口
{
 if(successor){
  successor->HandleHelp(theRequest);
 }
}

void HelpHandler::HandlePrint(Request *theRequest)
{
 if(successor){
  successor->HandlePrint(theRequest);
 }
}

void HelpHandler::HandleRequest(Request *theRequest)
{
 switch(theRequest->GetKind())
 {
 case HELP:
       HandleHelp((HandleHelp*)theRequest);
    break;
 case PRINT:
       HandlePrint((HandlePrint *)theRequest);
    break;
 default:
       break;
 }
}

class Request{

public:
 kind GetKind()
 {
       return k;
 }
 kind k;
 Request(kind Kind):k(Kind){}
};

class HandleHelp:  public Request {
   HandleHelp(kind Kind):Request(Kind){}
};

class HandlePrint: public Request{
 HandlePrint(kind Kind):Request(Kind){}
};

抱歉!评论已关闭.