[设计模式]行为模式-责任链(C++描述)
second60 20180605
1. 责任链模式定义
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。
发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
即可能处理一个请求的对象链接成一个链,并将请求在这个链上传递,直到有对象处理该请求。
2. 命令模式结构图
分析:
1. 抽象处理者Handler:定义出一个处理请求的接口。
2. 具体处理者ConcreteHandler: 具体处理者接到请求后,可以选择择将请求处理掉,或将请求传给下家。
3. 代码
class Handle { public: Handle(){_succ = NULL;} Handle(Handle* succ){_succ = succ;} virtual ~Handle(){delete _succ;} virtual void HandleRequest() = 0; void SetSuccessor(Handle *succ){_succ = succ;} Handle *GetSuccessor(){return _succ;} private: Handle* _succ; }; class ConcreteHandleA: public Handle { public: ConcreteHandleA(){} ~ConcreteHandleA(){} ConcreteHandleA(Handler* succ): Handle(succ){} void HandleRequest() { if(this->GetSuccessor() != 0) { this->GetSuccessor()->HandleRequest(); } else { // doing } } }; class ConcreteHandleB: public Handle { public: ConcreteHandleB(){} ~ConcreteHandleB(){} ConcreteHandleB(Handler* succ):Handle(succ){} void HandleRequest() { if(this->GetSuccessor()!=0) { this->GetSuccessor()->HandleRequest(); } else { // doing B } } }; int main() { Handle* h1 = new ConcreteHandlerA(); Handle* h2 = new ConcreteHandlerB(); h1->SetSuccessor(h2); h1->HandleRequest(); }
4 使用场景
1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求。
例子:
1. 客户端层级调用,每个层级可以定制自已的责任,然后调用时由监听的层级接收并处理
2. OA系统,请假流程,是一个责任链,先由组长审批,再经理,再HR等。中间审批的人,可自由定制。
3. 关于等级,工作流程等,都可使用。
5 优缺点
优点:
1. 降低耦合度。它将请求的发送者和接收者解耦。 请求的发送者完全不必知道该请求会被哪个应答对象处理,极大降低了系统的耦合性。
2. 简化了对象。使得对象不需要知道链的结构。
3. 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4. 增加新的请求处理类很方便。
缺点:
1. 不能保证请求一定被接收。
2. 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3. 可能不容易观察运行时的特征,有碍于除错。
6 总结
责任链模式,简单地说,就是一层一层往上报,层级间可处理,可不处理。在实际运用中,还是比较多场景可用。只要系统中涉及到层级和流程关系的,可以考虑下是否可以用责任链模式来处理。