行为模式6-职责链模式
职责链模式 Chain Of Responsibility
意图
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
问题思考
view的touch处理。从最上层view一层层传递到可以处理该touch事件的那一层,或者直到最下层。
适用性
- 有多个对象可以处理一个请求,按个对象处理该请求运行时刻自动确定。
- 想在不明确指定接受者的情况下,向多个对象中的一个提交一个请求。
效果
- 降低耦合度 该模式是的一个对象无需知道是其他哪个个对象处理其请求。
- 增强了给对象直白职责(Responsibility)的灵活性 可以在运行时刻对概念进行动态的增加或修改来增加或改变处理能力。
- 不保证被接受 既然一个请求没有明确的接受者,那么久不能保证它一定会被处理。
类图
chainOfResponsibility实现
class Handler {
public:
explicit Handler(Handler *successor) { mSuccessor = successor; }
// non-virtual
void Start(Request &request) {
bool handledByThisNode = Handle(request);
if (!handledByThisNode && !mSuccessor) {
mSuccessor->Start(request);
}
}
virtual bool Handle(Request &request) = 0;
void SetSuccessor(Handler *successor) { mSuccessor = successor; }
Handler *GetSuccessor() { return mSuccessor; }
private:
Handler *mSuccessor = nullptr;
};
class ConcreteHandler : public Handler {
public:
explicit ConcreteHandler(Handler *successor) : Handler(successor) {}
bool Handle(Request &request) override {
bool handledByThisNode = false;
// some code
return handledByThisNode;
}
};
网友评论