职责链模式

        避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,这就是职责链模式。

#include "stdafx.h"
#include <iostream>
#include <boost/make_shared.hpp>
#include <boost/shared_ptr.hpp>
#include <string>
using namespace boost;

//职责链模式就是一个请求提交给
//职责链中一连串的对象,如果遇到了
//符合处理条件的对象,就处理该请求
//否则就将请求交于该职责链中对象
//的后续对象进行处理,直到遇到符合请求
//条件的对象处理为止
class Request
{
public:
	Request(){}
	Request(const int &data){_m_nData = data;}
	virtual ~Request(){}
	int getData(){return _m_nData;}
protected:
	int _m_nData;
};
//职责链对象基类
class Handler
{
public:
	//处理Request类型对象的请求
	virtual void HandleRequest(shared_ptr<Request>) = 0;
	//设置下一个处理
	virtual void setNextHandler(shared_ptr<Handler> handler)
	{
		_m_Handler = handler;
	}
public:
	shared_ptr<Handler> _m_Handler;
};
class Handler1 : public Handler
{
public:
	virtual void HandleRequest(shared_ptr<Request> request)
	{
		if (request->getData() < 3)
		{
			std::cout << "Handle1 handled the request." << std::endl; 
		}
		else
		{
			this->_m_Handler->HandleRequest(request);
		}
	}
};

class Handler2 : public Handler
{
public:
	virtual void HandleRequest(shared_ptr<Request> request)
	{
		if (request->getData() < 7)
		{
			std::cout << "Handle2 handled the request." << std::endl; 
		}
		else
		{
			this->_m_Handler->HandleRequest(request);
		}
	}
};

class Handler3 : public Handler
{
public:
	virtual void HandleRequest(shared_ptr<Request> request)
	{
		if (request->getData() < 30)
		{
			std::cout << "Handle3 handled the request." << std::endl; 
		}
		else
		{
			std::cout << "Handle3 handled the request:don't agree." << std::endl; 
		}
	}
};

void testChainOfResponsibility()
{
	shared_ptr<Request> request1 = make_shared<Request>(2);
	auto request2 = make_shared<Request>(4);
	auto request3 = make_shared<Request>(6);
	auto request4 = make_shared<Request>(31);
	auto handler1 = make_shared<Handler1>();
	auto handler2 = make_shared<Handler2>();
	auto handler3 = make_shared<Handler3>();
	handler1->setNextHandler(handler2);
	handler2->setNextHandler(handler3);
	handler1->HandleRequest(request1);
 	handler1->HandleRequest(request2);
	handler1->HandleRequest(request3);
	handler1->HandleRequest(request4);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值