设计模式C++版:第十五式职责链模式

职责链模式:使多个对象都有机会处理请求,从而便面请求发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着链条传递该请求,直到有一个对象处理它为止。类似状态模式。接收者和发送者都没有对方的明确信息,且链中的对象,自己也不知道链的结构。职责链可以简化对象的相互连接,仅保持一个后继者的引用,而不需保持须有接收者的引用。大大降低了耦合度。    需要注意的是,他和状态模式一样,有可能到了链的末端,请求都没处理。


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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值