关键词:
数据结构模式
- 常常有一-些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。
典型模式
Chain of Resposibility
动机( Motivation )
- 在软件构建过程中, -个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指定,将必不可少地带来请求发送者与接受者的紧耦合。
- 如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求 ,从而使两者解耦。
模式定义
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
结构
要点总结
- Chain of Responsibility模式的应用场合在于“一个请求可能有,多个接受者,但是最后真正的接受者只有一个”, 这时候请求发送者与接受者的耦合有可能出现“变化脆弱”的症状,职责链的目的就是将二者解耦,从而更好地应对变化。
- 应用了Chain of Responsibility模式后,对象的职责分派将更具灵活性。我们可以在运行时动态添加/修改请求的处理职责。
- 如果请求传递到职责链的末尾仍得不到处理,应该有一个合理的,缺省机制。这也是每一个接受对象的责任,而不是发出请求的对象的责任。
cpp
#include<iostream>
#include<string>
enum class RequestType
REQ_HANDLER1,
REQ_HANDLER2,
REQ_HANDLER3
;
class Reqest
public:
Reqest(const std::string& desc, RequestType type) :description(desc), reqType(type)
RequestType getReqType()const return reqType;
const std::string& getDescription()const return description;
private:
std::string description;
RequestType reqType;
;
class ChainHandler
public:
ChainHandler() :nextChain(nullptr)
void setNextChain(ChainHandler* next) nextChain = next;
void handle(const Reqest& req)
if (this->canHandleRequest(req))
this->processRequest(req);
else
this->sendReqestToNextHandler(req);
protected:
virtual bool canHandleRequest(const Reqest&) = 0;
virtual void processRequest(const Reqest&) = 0;
private:
void sendReqestToNextHandler(const Reqest& req)
if (nextChain != nullptr)
nextChain->handle(req);
private:
ChainHandler* nextChain;
;
class Handler1 :public ChainHandler
public:
virtual bool canHandleRequest(const Reqest& req)
return req.getReqType() == RequestType::REQ_HANDLER1;
virtual void processRequest(const Reqest& req)
std::cout << "Handler1 is handle reqest: " << req.getDescription() << std::endl;
;
class Handler2 : public ChainHandler
protected:
bool canHandleRequest(const Reqest& req) override
return req.getReqType() == RequestType::REQ_HANDLER2;
void processRequest(const Reqest& req) override
std::cout << "Handler2 is handle reqest: " << req.getDescription() << std::endl;
;
class Handler3 : public ChainHandler
protected:
bool canHandleRequest(const Reqest& req) override
return req.getReqType() == RequestType::REQ_HANDLER3;
void processRequest(const Reqest& req) override
std::cout << "Handler3 is handle reqest: " << reqc.getDescription() << std::endl;
;
int main()
Handler1 h1;
Handler2 h2;
Handler3 h3;
h1.setNextChain(&h2);
h2.setNextChain(&h3);
Reqest req("process task ... ", RequestType::REQ_HANDLER3);
h1.handle(req);
return 0;
c++设计模式(代码片段)
对象创建模式通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式FactoryMethodAbstractFactoryPrototypeBuilder工厂方法(FactoryMethod)... 查看详情
c++设计模式(代码片段)
单一职责模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。典型模式DecoratorBridgeDecorator动机(Motivation)在某些情... 查看详情
c++设计模式(代码片段)
组件协作模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。典型模式TemplateMethodObserver/EventStrategyTempl... 查看详情
c++设计模式(代码片段)
对象创建模式通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式FactoryMethodAbstractFactoryPrototypeBuilderBuilder动机(Mot... 查看详情
c++设计模式(代码片段)
数据结构模式常常有一-些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访... 查看详情
c++设计模式(代码片段)
组件协作模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。典型模式TemplateMethodObserver/EventStrategyStrat... 查看详情
c++设计模式(代码片段)
数据结构模式常常有一-些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访... 查看详情
设计模式c++实现:装饰(decorator)模式(代码片段)
转载请注明,来自:http://blog.csdn.net/skyman_2001classComponentpublic: Component() virtual~Component() virtualvoidoperation()=0; virtualComponent*remove()=0;;classConcreteComponent:publi 查看详情
c++设计模式(代码片段)
领域规则模式在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。典型模式InterpreterInterpreter动机(Motivation)在软件构建过程中,如果某一... 查看详情
c++设计模式:单例模式(代码片段)
1.设计思想: 单例模式,顾名思义,即一个类只有一个实例对象。C++一般的方法是将构造函数、拷贝构造函数以及赋值操作符函数声明为private级别,从而阻止用户实例化一个类。那么,如何才能获得该类的对象呢?这时,需... 查看详情
c++装饰器模式的实现(代码片段)
...象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。意图:动态地给一个对象添加一些额外的 查看详情
工厂模式c++实现(代码片段)
参考书籍《HeadFirst设计模式》参考文章:设计模式:简单工厂、工厂方法、抽象工厂之小结与区别_superbeck的专栏-CSDN博客_简单工厂模式,工厂方法模式,抽象工厂模式简单工厂,工厂方法,抽象工厂都属于设计模式... 查看详情
策略模式c++实现(代码片段)
参考书籍《HeadFirst设计模式》设计模式和设计原则策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。策略模式采用的设计原则:1、找出应用中可能需... 查看详情
命令模式c++实现(代码片段)
参考书籍《HeadFirst设计模式》命令模式 命令模式-将请求封装成对象,这可以让你使用不同的请求、队列,或者日志请求来参数化对象。命令模式也可以支持撤销操作。 命令模式将发出请求的对象... 查看详情
设计模式c++工厂方法模式(代码片段)
推荐阅读设计模式C++简单工厂模式工厂方法模式是在简单工厂模式的缺点上进行优化的,我们都知道,在简单工厂模式中,要去增加或者减少一个产品的类型,都需要修改工厂中的if-else判断。这样子显然不... 查看详情
c++单例模式(代码片段)
1.什么是单例模式因为在设计或开发中,肯定会有这么一种情况,一个类只能有一个对象被创建,如果有多个对象的话,可能会导致状态的混乱和不一致。这种情况下,单例模式是最恰当的解决办法。2.单例模式实现Singleton.cpp#inc... 查看详情
c++代理模式的实现(代码片段)
代理模式-ProxyPattern模式思想简介组成优点代码实现情景代码解读结果参考资料模式思想简介代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象... 查看详情
c++单例模式(代码片段)
什么是单例模式? 一种创建型的设计模式,该模式的主要目的就是确保某个类有且仅有一个实例存在。 单例模式有三个关键点: 1、单例类只能有一个实例。 为此,单例类只能提供私有的构造函数,即保证... 查看详情