设计模式(13)——职责链 Chain Of Responsibility
来源:互联网 发布:汉聚网络可靠吗 编辑:程序博客网 时间:2024/05/17 07:21
目录:
设计模式学习笔记首页
设计模式(1)——抽象工厂 AbstractFactory
设计模式(2)——生成器 Builder
设计模式(3)——工厂方法 Factory Method
设计模式(4)——原型 Prototype
设计模式(5)——单例 Singleton
设计模式(6)——适配器 Adapter
设计模式(7)——桥接 Bridge
设计模式(8)——组合 Composite
设计模式(9)——装饰 Decorator
设计模式(10)——外观 Facade
设计模式(11)——享元 Flyweight
设计模式(12)——代理 Proxy
设计模式(13)——职责链 Chain Of Responsibility
设计模式(14)——命令 Command
设计模式(15)——解释器 Interpreter
设计模式(16)——迭代器 Iterator
设计模式(17)——中介者 Mediator
设计模式(18)——备忘录 Memento
设计模式(19)——观察者 Observer
设计模式(20)——状态 State
设计模式(21)——策略 Strategy
设计模式(22)——模板方法 Template Method
设计模式(23)——访问者 Visitor
十三、Chain Of Responsibility (职责链,对象行为模式)
1. 意图:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
2. 适用:
- 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
- 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应被动态指定。
3. 类图:
4. 例:
c++ 的异常处理就是一种职责链的模式,当程序出现异常的时候,就会一层一层往外抛,直到异常被处理。我们可以动态地添加异常处理代码,去处理异常。
5. C++实现:
- 先编写一个父类或接口
Handle
,has-a
后继节点Handle对象private Handle* _succ;
- 编写初始化后继节点代码:
2.1 通过构造函数Handle(Handle* succ){this->_succ = succ;}
2.2 编写Set函数void SetSuccessor(Handle* succ){_succ = succ;}
2.3 编写处理请求(职责)方法HandleRequest();
2.4 编写一些子类或实现类如 ConcreteHandleA、ConcreteHandleB等,调用相关初始化后继节点方法,实现职责链(链表)
Handle.h
//Handle.h#pragma onceclass Handle {public: virtual ~Handle(); virtual void HandleRequest() = 0; void SetSuccessor(Handle* succ); Handle* GetSuccessor();protected: Handle(); Handle(Handle* succ);private: Handle* _succ;};class ConcreteHandleA : public Handle {public: ConcreteHandleA(); ~ConcreteHandleA(); ConcreteHandleA(Handle* succ); void HandleRequest();protected:private:};class ConcreteHandleB : public Handle {public: ConcreteHandleB(); ~ConcreteHandleB(); ConcreteHandleB(Handle* succ); void HandleRequest();protected:private:};
Handle.cpp
//Handle.cpp#include "Handle.h"#include <iostream>using namespace::std;Handle::Handle() { _succ = 0;}Handle::Handle(Handle* succ) { _succ = succ;}Handle::~Handle() { delete _succ;}void Handle::SetSuccessor(Handle* succ) { _succ = succ;}void Handle::HandleRequest() {}Handle* Handle::GetSuccessor(){ return _succ;}ConcreteHandleA::ConcreteHandleA() {}ConcreteHandleA::ConcreteHandleA(Handle* succ) : Handle(succ){}ConcreteHandleA::~ConcreteHandleA() {}void ConcreteHandleA::HandleRequest() { if (this->GetSuccessor() != 0) { cout << "ConcreteHandleA 我把处理权给后继节点......" << endl; this->GetSuccessor()->HandleRequest(); } else { cout << "ConcreteHandleA 没有后继节点了,我必须自己处理......" << endl; }}ConcreteHandleB::ConcreteHandleB() {}ConcreteHandleB::ConcreteHandleB(Handle* succ) : Handle(succ) {}ConcreteHandleB::~ConcreteHandleB() {}void ConcreteHandleB::HandleRequest() { if (this->GetSuccessor() != 0) { cout << "ConcreteHandleB 我把处理权给后继节点......" << endl; this->GetSuccessor()->HandleRequest(); } else { cout << "ConcreteHandleB 没有后继了,我必须自己处理......" << endl; }}
main.cpp
// main.cpp#include "Handle.h"#include <iostream>using namespace::std;int main(int argc, char* argv[]) { Handle* h1 = new ConcreteHandleA(); Handle* h2 = new ConcreteHandleB(); h1->SetSuccessor(h2); h1->HandleRequest(); return 0;}
- 设计模式—Chain of Responsibility职责链模式
- 设计模式(13)——职责链 Chain Of Responsibility
- 设计模式之对象行为型模式 — CHAIN OF RESPONSIBILITY (职责链)模式
- Chain of Responsibility(职责链设计模式)
- 重温设计模式(三)——职责链模式(chain of responsibility) [转载]
- 重温设计模式(三)——职责链模式(chain of responsibility)
- 重温设计模式(三)——职责链模式(chain of responsibility)
- Java设计模式——职责链模式(Chain of Responsibility)
- 设计模式的征途—14.职责链(Chain of Responsibility)模式
- 设计模式-职责链模式(chain of Responsibility)
- 设计模式:行为模式:职责链(chain of responsibility)
- 设计模式之职责链模式(Chain Of Responsibility)
- 设计模式学习笔记(十五)——Chain Of Responsibility职责链
- 设计模式13 - 职责链Chain-Of-Responsibility
- 设计模式--职责链(Chain of Responsibility)
- 《GOF设计模式》—职责链(CHAIN OF RESPONSIBILITY)—Delphi源码示例:职责链接口
- 职责链模式(Chain of Responsibility)
- Chain of Responsibility(职责链模式)
- summernote文本编辑内容在前端的显示
- thinkphp之切换数据库
- java连接数据库方式(二):单独使用MyBatis 框架实现
- 【bzoj3315】[Usaco2013 Nov]Pogo-Cow
- 设计模式—单例模式
- 设计模式(13)——职责链 Chain Of Responsibility
- 数据结构—AVL树
- 电路板初级知识
- Material Design学习之滑动菜单——DrawerLayout 和NavigationView(2)
- css的梳理
- 完全背包
- 基于OpenCv的四轴飞行器寻迹系统(二)——linux下QT的安装及导入OpenCv
- 简单的sort排序
- 异常