设计模式
文章平均质量分 84
Hui_NJ
11年多的C/C++研发经验
展开
-
行为设计模式---迭代器模式(Iterator)
iterator模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示 #include #include using namespace std; template class Iterator; template class AggregateIter; template class Aggregate { public: v原创 2014-08-18 15:39:49 · 403 阅读 · 0 评论 -
结构型设计模式---外观模式(Facade)
外观模式(Facade):为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 假设有一个抵押系统,存在三个子系统,银行子系统(查询是否有足够多的存款)、 信用子系统(查询是否有良好的信用)以及贷款子系统(查询有无贷款劣迹), 只有这三个子系统都通过时才可进行抵押。 当客户申请抵押贷款时,他需要分别去这三个子系统办理相关手续,原创 2014-08-14 15:09:12 · 439 阅读 · 0 评论 -
创建型设计模式---工厂模式
(1)简单工厂:只有一个工厂类,在工厂中根据产品的类型每次只能生产指定类型的产品 class Factory { public: ProductBase * createProduct(char type) { switch(type) { case 'A' return new ProductA();原创 2014-08-15 16:27:32 · 374 阅读 · 0 评论 -
行为设计模式---责任链模式(Chain of Responsibility)
责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止 责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。 一个链可以是一条线,一个树,也可以是一个环。 .e.g CountryHospital --> LittleSick CityHospital原创 2014-09-23 09:30:59 · 390 阅读 · 0 评论 -
行为设计模式---访问者模式(Visitor)
访问者模式: 封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作 首先我们拥有一个由许多对象构成的对象结构,这些对象的类(Book)都拥有一个accept方法用来接受访问者对象; 访问者(IBookVisitor)是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素作出不同的反应; 在对象结构的一次访问过程中,我们原创 2014-09-23 21:41:32 · 449 阅读 · 0 评论 -
行为设计模式---观察者模式(Observer)
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象, 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 最常见的一个例子就是:对同一组数据进行统计分析时候, 我们希望能够提供多种形式的表示(例如以表格进行统计显示、柱状图统计显示、百分比统计显示等)。 Observer.h #ifndef _OBSERVER_H_ #define _原创 2014-09-24 11:09:54 · 442 阅读 · 0 评论 -
创建型设计模式---单例模式(Singleton)
#include #include #include using namespace std; class SingleSection { public: SingleSection() { pthread_mutex_init(&mutex_, NULL); } ~Sing原创 2014-09-03 16:21:25 · 456 阅读 · 0 评论 -
行为设计模式---中介者模式(Mediator)
中介者模式:定义一个对象封装一系列多个对象如何相互作用,使得对象间不需要显式地相互引用, 从而使其耦合更加松散,并且还让我们可以独立变化多个对象相互作用。如QQ聊天室 #include #include #include #include using namespace std; class Colleague; class IMediator { public:原创 2014-09-26 13:34:03 · 508 阅读 · 0 评论 -
行为设计模式---备忘录模式(Memento)
备忘录模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 这样以后就可将该对象恢复到原先保存的状态。 Memento.h #ifndef _MEMENTO_H_ #define _MEMENTO_H_ class Number; class Memento { public: Memento(int state); private:原创 2014-09-29 13:12:38 · 362 阅读 · 0 评论 -
行为设计模式---解释器模式(Interpreter)
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器, 这个解释器使用该表示来解释语言中的句子。 Iterpreter.h #ifndef _ITERPRETER_H_ #define _ITERPRETER_H_ #include using std::string; class Context { public: Context() {}原创 2014-09-30 07:20:37 · 482 阅读 · 0 评论 -
行为设计模式---策略模式(Strategy)
策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 一家公司的主要产品是一种可以模拟展示多种会游泳和叫的鸭子的游戏 我们知道鸭子都会游泳,但并不是所有的鸭子都会飞,而且鸭子的叫声也可以不同; 所以,我们需要将鸭子中变化的特征(Fly,Quack)和不变的特征分开(Swim). 优点: (1) 简化了单元测试,因为每个算法都原创 2014-09-22 13:07:06 · 372 阅读 · 0 评论 -
创建型设计模式---原型模式(Prototype)
Prototype模式用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 (1)当我们的对象类型不是开始就能确定的,而这个类型是在运行期确定的话, 那么我们通过这个类型的对象克隆出一个新的对象比较容易一些 (2)有的时候,我们需要一个对象在某个状态下的副本,此时,我们使用原型模式是最好的选择; 例如:一个对象,经过一段处理之后,其内部的状态发生了变化;这个时候, 我们需要一原创 2014-08-27 14:04:40 · 432 阅读 · 0 评论 -
行为设计模式---命令模式(Command)
命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作 (1)Command,用来声明执行操作的接口 (2)ConcreteCommand,将一个接收者对象绑定于一个操作,调用接收者相应的操作,以实现Execute (3)Invoker类,要求该命令执行这个请求 (4)Receiver类,知道如何实施与执行一个与请求相原创 2014-08-20 15:18:28 · 457 阅读 · 0 评论 -
行为设计模式---状态模式(State)
状态模式:允许一个对象在其内部状态改变的时候改变其行为 #include using namespace std; class Worker; class State { public: virtual ~State() {} virtual void showStatus(Worker *worker) = 0; }; class Workd原创 2014-08-22 15:20:47 · 483 阅读 · 0 评论 -
结构型设计模式---组合模式(Composite)
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。 Composite使得用户对单个对象和组合对象的使用具有一致性。 适用场景: (1)所要表示的对象具有部分-整体的层次结构 (2)用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象 Composite.h #ifndef _COMPOSITE_H_ #define _COMPOSITE_H_ #i原创 2014-08-12 14:07:08 · 358 阅读 · 0 评论 -
结构型设计模式---装饰者模式(Decorator)
装饰者模式动态地给对象添加新职责,装饰者提供了比继承更有弹性的替代方案 适用场景: (1)需要扩展一个类的功能,或给一个类增加附加责任。 (2)需要动态地给一个对象增加功能,这些功能可以再动态地撤销。 (3)需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。 优点: (1)Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorat原创 2014-08-12 11:04:44 · 445 阅读 · 0 评论 -
结构型设计模式---代理模式(Proxy)
代理模式: 为其他对象提供一种代理,并以控制对这个对象的访问。(Provide a surrogate or placeholder for another object to control access to it. ) 而对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。 它是给某一个对象提供一个替代者(占位者),使之在client对象和subje原创 2014-08-07 15:20:49 · 449 阅读 · 0 评论 -
结构型设计模式---适配器模式(adapter)
SGI STL stack系以deque作为底部容器完成其所有工作,而具有这种“修改某物接口,形成另一种风貌”之性质者,称为 适配器(adapter),stack被归类为 container adapter,这种容器适配器还有queue, priority_queue,它们没有迭代器。 适用情况: 使用一个已经存在的类,如果它的接口和你实际要求的不一致时,可以考虑使用适配器模式 #incl原创 2014-08-13 11:24:05 · 412 阅读 · 0 评论 -
结构型设计模式---桥接模式(Bridge)
桥接模式:使用组合的方式将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化。 这样的好处是抽象和实现可以分别独立地变化,系统的耦合性也得到了很好的降低. Bridge.h #ifndef _BRIDGE_H_ #define _BRIDGE_H_ class TimeImp { public: TimeImp(int hr, in...原创 2014-08-12 15:39:34 · 447 阅读 · 0 评论 -
创建型设计模式---构建模式(Builder)
builder模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 适用场景: (1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时 (2)当构造过程必须允许被构造的对象有不同的表示时 #include #include #include using namespace std; class Vehicle { public:原创 2014-08-26 17:08:34 · 457 阅读 · 0 评论 -
结构型设计模式---享元模式(Flyweight)
享元模式以共享的方式高效地支持大量的细粒度对象。 享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。 内蕴状态是存储在享元对象内部并且不会随环境改变而改变,因此内蕴状态并可以共享。 外蕴状态是随环境改变而改变的、不可以共享的状态。 享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后, 在需要使用的时候再传入到享元对象原创 2014-08-14 14:20:55 · 343 阅读 · 0 评论 -
行为设计模式---模板方法模式(Template Method)
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 Template.h #ifndef _TEMPLATE_H_ #define _TEMPLATE_H_ class Account { public: virtual void start() = 0; virtual原创 2014-09-30 07:57:18 · 380 阅读 · 0 评论