设计模式
文章平均质量分 57
oyhy_
这个作者很懒,什么都没留下…
展开
-
Factory模式
1.工厂模式Factory Pattern 1.1.实现 2.AbstractFactory模式 2.1.实现Factory模式是创建对象时用的.在面向对象语言设计程序时,经常遇到以下2个问题:为了提高内聚和松耦合,经常抽象出类的一些公共接口形成抽象基类或接口.这样在使用时可以通过基类的指针或引用调用子类,实现多态.这样在需要创建子类的时候就new class,这样创建子类.由此带来两个问题原创 2017-05-04 17:36:12 · 488 阅读 · 0 评论 -
Iterator模式
STL中的集合都有Iterator,Iterator模式的作用是遍历集合中的元素.它的实现原理为遍历封装在一个类中进行(Iterator类),这样避免了暴露这个聚合对象内部.Iterator模式如下图: 实现: //Aggregate.h#ifndef AGGREGATE_H_#define AGGREGATE_H_typedef int Object;class Iterator;cla原创 2017-05-06 16:24:35 · 303 阅读 · 0 评论 -
Chain of Responsibility模式
Chain of Responsibility(职责链)模式消息传递是面向对象开发中经常用到的机制,例如异常的传递,如果当前函数/类无法处理异常,可以将其抛到上一层.消息传递类似,如果一个类收到消息,如果当前类无法处理,可以将消息按照预先定义好的路径传递下去,直到有类可以处理这个消息,这就是Chain of Responsibility模式.Handle类中持有自己的指针/引用,指向某一个派生类.如原创 2017-05-06 16:13:01 · 387 阅读 · 0 评论 -
Visitor模式
在开发时有时会遇到需求变动,这样就要经常去修改已有的设计.比较常见的是在实现好的类中添加新方法客户新需求.这时可以使用Visitor模式.Visitor模式则提供了一种解决方案:将更新封装到一个类中,并由待更改类提供一个接收接口,来实现目的.这里对对象(concreteElement)添加了一个统一的接口:Accept函数,来接收一个访问者对象.通过参数Visitor把对对象的操作移到类外,通过调用原创 2017-05-06 15:54:00 · 372 阅读 · 0 评论 -
Command模式
在开发中,有时需要向对象发送请求,但是不知道请求的接受者是谁,被请求的操作是什么.这时可以使用Command模式.Command模式将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的ConcreteCommand类中的Receiver中.这样实现了操作的对象和操作的具体实现之间的解耦.实现//Receiver.h#ifndef _RECIEVER_H_#define _RECI原创 2017-05-06 15:08:08 · 273 阅读 · 0 评论 -
Memento模式
Memento(备忘录)模式一个类有很多状态,在开发时有时会遇到想把这个类恢复到之前某一个状态(例如撤销),这时候就用到了Memento模式.Memento模式思想比较简单,就是创建一个类Memento对象来记录另一个类的状态,可以用这个Memento对象将它恢复到创建它时的状态.用类图表示如下: 在实现时,类Memento所有方法都为private,类Originator为其友元,这样其他类就无原创 2017-05-06 14:31:08 · 292 阅读 · 0 评论 -
Observer模式
Observer模式是开发中,使用比较多的模式之一.Observer模式叫做观察者模式,它定义了一种一对多的依赖模式,让多个观察者同时监听某一对象状态,当这个对象状态发生变化时,这些观察者都得到通知.下图即为Observer模式的类图: 实现如下: //Subject.h//Subject.h#ifndef _SUBJECT_H_#define _SUBJECT_H_#include <s原创 2017-05-06 14:12:20 · 355 阅读 · 0 评论 -
State模式
一个事物,在不同的状态下会有不同的动作,还可以变化到另一个状态,在开发时有时会遇到这样的事物.有限状态机就是这样的一个事物,在实现时用到了switch case来解决,在状态不多时,这样可以解决,如何状态很多,switch case就会变得难以维护.switch case还有一个缺点就是逻辑和实现没有分离,动作的代码直接写在了逻辑里,使得维护和扩展变得困难.State模式就是解决这个问题的.其类图结原创 2017-05-06 13:45:14 · 272 阅读 · 0 评论 -
Strategy模式
Strategy模式Strategy模式要解决的问题和Template模式相似,都是为了把算法的声明和算法的实现解耦.Template模式是通过继承来实现的,而Strategy模式是通过组合来实现的.Strategy模式将算法封装到一个类(Context)里面,通过组合的方式将算法在组合的对象中实现,之后通过委托将抽象接口委托给组合对象来实现.其类结构图如下 实现://Strategy.h//St原创 2017-05-05 18:43:19 · 312 阅读 · 0 评论 -
Template模式
Template(模板)模式在开发时,有时会遇到对于一个算法的实现,在不同的对象中有不同的实现的问题,但是这个算的框架是相同的,这时可以使用Template模式或者Strategy模式.Template是采用继承的方式来实现这一点,即将算法框架放在抽象基类中,在基类定义好接口,之后在派生类实现算法.类图结构如图所示: 算法实例://Template.h//Template.h#ifndef _TE原创 2017-05-05 18:14:43 · 530 阅读 · 0 评论 -
Facade模式
Facade(外观模式)模式在开发时,有时已经实现了一些接口,这些接口分布在不同的类或模块中.客户在使用时,需要使用几个接口的组合,但是并不关心这些接口在哪,怎么实现这些接口的.为了便于客户使用,给客户提供一个一致的界面,可以使用Facade模式.此模式定义了一个高层接口,使得子系统更加容易使用.Facade模式的类结构图如下: 其实现如下://Facade.h//Facade.h#ifndef原创 2017-05-05 17:53:30 · 303 阅读 · 0 评论 -
Flyweight模式
Flyweight(享元)模式在开发时,如果创建很多对象,就会造成很大的内存开销,特别是大量轻量级(细粒度)的对象,还会造成内存碎片.Flyweight模式就是运用共享技术,有效支持大量细粒度对象的设计模式.其类结构图如下: 在FlyweightFactory中有一个管理,存储对象的对象池,当调用GetFlyweight时会首先遍历对象池,如果已存在,则返回,否则创建新对象添加到对象池中.有些对象原创 2017-05-05 17:42:21 · 420 阅读 · 0 评论 -
Composite模式
在开发时,如果遇到使用递归构建树状的组合结构,那么可以考虑使用Composite模式.Composite模式将对象组合成树形结构,来表示部分,整体的层次结构. 解决整合与部分可以被一致对待问题。其类结构如图所示: 在Component中声明可所有管理子类对象的方法,因此实现Component接口的子类都有了Add,Remove等功能,这样叶子节点和枝节点对于外界没有区别;但是因为Leaf类本身不原创 2017-05-05 14:39:47 · 288 阅读 · 0 评论 -
Decorator模式
Decorator模式在开发过程中,有时会遇到需要向已经定义好的类添加新功能的需求,这时候通常的做法就是定义一个新类,继承这个类,在新类中添加新功能.采用继承的方式来实现,在使用时,我们经常使用父类的指针或引用通过多态技术来调用子类的接口,但这样就会遇到一个问题:再向子类添加方法时,也需要向父类添加方法,否则通过父类指针或引用就调用不到这个方法.所以Decorator模式没有采用继承来实现,而是采用原创 2017-05-05 14:04:31 · 303 阅读 · 0 评论 -
Adapter模式
1.Adapter模式 1.1.类模式 1.2.对象模式Adapter模式在软件开发过程中,经常会使用第三方库.如果使用第三方库,那么我们对客户提供的接口和第三方库接口不一致时,应该怎么解决.这是Adapter模式要解决的问题.即把一个类的接口转化为客户希望的接口.适用场景:1、已经存在的类的接口不符合我们的需求;2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类(即那些接口可原创 2017-05-05 01:01:09 · 403 阅读 · 0 评论 -
Bridge模式
Bridge模式在面向对象的开发过程中,要做到2点:1.高内聚 2.松耦合.但是在实际开发过程中难以把握,例如会遇到这样的问题:1)客户给了一个需求,之后我们用一个类A来实现.2)客户的需求有了变化,要用到2个算法来实现.于是我们通过定义一个抽象基类A,再用两个具体类A1和A2实现这两个算法.3)客户需求又有了变化,要求在2个操作系统上实现.我们再抽象一个层次,不同操作系统抽象为A0和A1,每个操作原创 2017-05-05 00:19:03 · 242 阅读 · 0 评论 -
Prototype模式
Prototype模式Prototype模式(原型模式)是为了让对象自我复制的功能,即可以通过已有对象来创建新对象.Prototype提供了在一个现有对象创建新对象的接口Clone,它的实现和具体语言相关,在C++中通过拷贝构造函数实现.类的结构图如下所示: 实现如下: //Prototype.h//Prototyep#ifndef _PROTOTYPE_H_#define _PROTOTYP原创 2017-05-04 23:58:55 · 306 阅读 · 0 评论 -
Builder模式
Builder模式Builder 模式 —— 建造者模式(又译成生成器模式)的主要功能是构建复杂的产品,它是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。举个例子,打个生产电脑的比方,这里简单一点,假设生产电脑只需要 CUP、内存和显卡,现在需要生产宏基和戴尔两个品牌的电脑,不用设计模式的实现Acer.javaimport java.util.ArrayList;imp原创 2017-05-04 20:10:51 · 341 阅读 · 0 评论 -
常见设计模式的应用场景
设计模式主要分为三个类型:创建型,结构型和行为型.其中创建型有:1.Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 应用场景:一个无状态的类使用单例模式节省内存资源.2.Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. 应用场景:一系列相互依赖的对象有不同的具体实现.提供一种"封装机制"来避免客户转载 2017-05-06 20:52:40 · 731 阅读 · 0 评论