23种设计模式(C++)之 职责链(Chain of Responsibility)模式
23种设计模式(C++)之 职责链(Chain of Responsibility)模式
意图
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间存在耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
场景
- 有多种对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
- 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应被动态指定。
比如说,一个生产多种汽车的企业,收到电动汽车的制造订单,它需要先匹配订单类型,匹配完后发给电动汽车车间。如果采用职责链模式,它只需要事先给车间排个序,然后把订单发下去,车间查看订单,如果匹配上就生产,不匹配就传给下个车间,知道有车间匹配上为止。
角色
- Handler
- 定义一个处理请求的接口
- (可选)实现后继链
- ConcreteHandler
- 处理它负责的请求
- 可访问它的后继者
- 如果可处理请求,就处理它;负责就将该请求转发给它的后继者
- Client
- 向链上的具体处理者(ConcreteHandler)对象提交请求
实例
以一家生产电动汽车,油动汽车以及油电混合汽车的企业为例。
- 枚举汽车类型
enum CarType
{
ElectricCarType = 0,
OilCarType,
HybridCarType,
};
- 创建汽车生产抽象类
class CarMadeHandler
{
protected:
CarMadeHandler *nextCarMadeHandler;
public:
void setNextHandler(CarMadeHandler* nextHandler)
{
if (nextHandler != NULL)
{
this->nextCarMadeHandler = nextHandler;
}
}
virtual void handleMakeCar(const CarType carType) = 0;
};
- 创建具体类型汽车生产类
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);
}
}
}
};
- 创建客户端
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);
}
- 结果
Electric car is made.
Oil car is made.
Hybrid car is made.