天天看点

23种设计模式(C++)之 职责链(Chain of Responsibility)模式23种设计模式(C++)之 职责链(Chain of Responsibility)模式

23种设计模式(C++)之 职责链(Chain of Responsibility)模式

  • 23种设计模式(C++)之 职责链(Chain of Responsibility)模式
    • 意图
    • 场景
    • 角色
    • 实例

23种设计模式(C++)之 职责链(Chain of Responsibility)模式

意图

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间存在耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

场景

  • 有多种对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  • 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 可处理一个请求的对象集合应被动态指定。

比如说,一个生产多种汽车的企业,收到电动汽车的制造订单,它需要先匹配订单类型,匹配完后发给电动汽车车间。如果采用职责链模式,它只需要事先给车间排个序,然后把订单发下去,车间查看订单,如果匹配上就生产,不匹配就传给下个车间,知道有车间匹配上为止。

角色

  • Handler
    • 定义一个处理请求的接口
    • (可选)实现后继链
  • ConcreteHandler
    • 处理它负责的请求
    • 可访问它的后继者
    • 如果可处理请求,就处理它;负责就将该请求转发给它的后继者
  • Client
    • 向链上的具体处理者(ConcreteHandler)对象提交请求

实例

以一家生产电动汽车,油动汽车以及油电混合汽车的企业为例。

  1. 枚举汽车类型
enum CarType
{
	ElectricCarType = 0,
	OilCarType,
	HybridCarType,
};
           
  1. 创建汽车生产抽象类
class CarMadeHandler
{
protected:
	CarMadeHandler *nextCarMadeHandler;
public:
	void setNextHandler(CarMadeHandler* nextHandler)
	{
		if (nextHandler != NULL)
		{
			this->nextCarMadeHandler = nextHandler;
		}
	}
	virtual void handleMakeCar(const CarType carType) = 0;
};
           
  1. 创建具体类型汽车生产类
class ElectricCarMadeHandler : public CarMadeHandler
{
public:
	void handleMakeCar(const CarType carType)
	{
		if (carType == ElectricCarType)
		{
			cout << "Electric car is made." << endl;
		}
		else 
		{
			if (this->nextCarMadeHandler != NULL)
			{
				this->nextCarMadeHandler->handleMakeCar(carType);
			}
		}
	}
};

class OilCarMadeHandler : public CarMadeHandler
{
public:
	void handleMakeCar(const CarType carType)
	{
		if (carType == OilCarType)
		{
			cout << "Oil car is made." << endl;
		}
		else
		{
			if (this->nextCarMadeHandler != NULL)
			{
				this->nextCarMadeHandler->handleMakeCar(carType);
			}
		}
	}
};

class HybridCarMadeHandler : public CarMadeHandler
{
public:
	void handleMakeCar(const CarType carType)
	{
		if (carType == HybridCarType)
		{
			cout << "Hybrid car is made." << endl;
		}
		else
		{
			if (this->nextCarMadeHandler != NULL)
			{
				this->nextCarMadeHandler->handleMakeCar(carType);
			}
		}
	}
};
           
  1. 创建客户端
int main()
{
	CarMadeHandler* electricCar = new ElectricCarMadeHandler();
	CarMadeHandler* oilCar = new OilCarMadeHandler();
	CarMadeHandler* hybridCar = new HybridCarMadeHandler();
	//Create chain of responsibility
	electricCar->setNextHandler(oilCar);
	oilCar->setNextHandler(hybridCar);
	//Make car
	electricCar->handleMakeCar(ElectricCarType);
	electricCar->handleMakeCar(OilCarType);
	electricCar->handleMakeCar(HybridCarType);
}
           
  1. 结果
Electric car is made.
Oil car is made.
Hybrid car is made.
           

继续阅读