职责链模式:使多个对象都有机会处理请求,从而便面请求发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着链条传递该请求,直到有一个对象处理它为止。类似状态模式。接收者和发送者都没有对方的明确信息,且链中的对象,自己也不知道链的结构。职责链可以简化对象的相互连接,仅保持一个后继者的引用,而不需保持须有接收者的引用。大大降低了耦合度。 需要注意的是,他和状态模式一样,有可能到了链的末端,请求都没处理。
include<string>
using std::string;
class Request
{
public:
void setnum(int num)
{
m_num = num;
}
int getnum()
{
return m_num;
}
private:
int m_num;
};
class Manager
{
public://外部可以调用
Manager(string name) :m_name(name)
{
}
virtual ~Manager(){}
virtual void setsuperior(Manager*manager)
{
this->m_superior = manager;
}
virtual void requestdeal(Request request){}
protected: //受保护被继承
string m_name;
Manager * m_superior;
};
//经理
class CommanManager:public Manager
{
public://外部可以调用
CommanManager(string name) :Manager(name)
{
}
virtual void requestdeal(Request request)
{
if (request.getnum()<=2)
{
printf("%d,%s可以批准\n",request.getnum(),m_name.c_str());
}
else
{
printf("%d,%s处理不了,向上传达\n", request.getnum(), m_name.c_str());
if (m_superior !=nullptr)
{
m_superior->requestdeal(request);
}
}
}
};
//总监
class MajorManager :public Manager
{
public://外部可以调用
MajorManager(string name) :Manager(name)
{
}
virtual void requestdeal(Request request)
{
if (request.getnum() <= 7)
{
printf("%d,%s可以批准\n",request.getnum() ,m_name.c_str());
}
else
{
printf("%d,%s处理不了,向上传达\n", request.getnum(),m_name.c_str());
if (m_superior != nullptr)
{
m_superior->requestdeal(request);
}
}
}
};
//总经理
class GeneralManager :public Manager
{
public://外部可以调用
GeneralManager(string name) :Manager(name)
{
}
virtual void requestdeal(Request request)
{
printf("我是%s,所有天数都可以批准\n", m_name.c_str());
}
};
int main()
{
CommanManager jingli("经理");
MajorManager zongjian("总监");
GeneralManager zjli("总经理");
//注册上级
jingli.setsuperior(&zongjian);
zongjian.setsuperior(&zjli);
Request reques;
reques.setnum(15);
jingli.requestdeal(reques);
return 0;
}