设计模式之责任链Chain of Responsibility

将一种响应(请求)通过一条彼此关联的处理类处理。一般遵照由小到大的粒度。


典型的例子:界面帮助请求


代码示例:

class PurchasePower
{
	protected:
	static final double _BASE = 500;
	PurchasePower* _successor;
	
	protected:
	virtual double getAllowable() = 0;
	virtual string getRole() = 0;
	
	void setSuccessor(PurchasePower* successor)
	{
		_successor = successor;
	}
	
	void processRequest(PurchaseRequest* request)
	{
		if(reuqest->getAmount() < getAllowable() )
		{
			cout << getRole() << "will approve $" + request->getAmount() << endl;
		}
		else if(_successor != nullptr)
		{
			_successor->processRequest(request);
		}
	}
};

class ManagerPPower : public PurchasePower
{
	protected:
	virtual double getAllowable() override
	{
		return _BASE * 10;
	}
	
	virtual string getRole() override
	{
		return "Manager";
	}	
};

class DirectorPPower : public PurchasePower
{
	protected:
	virtual double getAllowable() override
	{
		return _BASE * 20;
	}
	
	virtual string getRole() override
	{
		return "Director";
	}
};

class VicePresidentPPower : public PurchasePower
{
	protected:
	virtual double getAllowable() override
	{
		return _BASE * 40;
	}
	
	virtual string getRole() override
	{
		return "Vice President";
	}
};


class PresidentPPower : public PurchasePower
{
	protected:
	virtual double getAllowable() override
	{
		return _BASE * 60;
	}
	
	virtual string getRole() override
	{
		return "President";
	}
};

class PurchaseRequest
{
	private:
	double _amount;
	string _purpose;
	
	public:
	PurchaseRequest(double amount, string purpose)
	{
		_amount = amount;
		_purpose = purpose;
	}
	
	double getAmount()
	{
		return _amount;
	}
	
	void setAmount(double amount)
	{
		_amount = amount;
	}
	
	string getPurpose()
	{
		return _purpose;
	}
	
	void setPurpose(string purpose)
	{
		_purpose = purpose;
	}
};

void main()
{
	ManagerPPower* manager = new ManagerPPower();
	DirectorPPower* director = new DirectorPPower();
	VicePresidentPPower* vp = new VicePresidentPPower();
	PresidentPPower* president = new PresidentPPower();
	
	manager->setSuccessor(director);
	director->setSuccessor(vp);
	vp->setSuccessor(president);
		
	try
	{
		while(true)
		{
			cout << "Enter the amount to check who should approve your expenditure." << endl;
			cout << ">" << endl;
			double d = 0;
			cin >> d;
			manager->processRequest(new PurchaseRequest(d, "General"));
		}
	}
	catch(...)
	{
		exit(1);
	}
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值