
设计模式笔记
文章平均质量分 86
jjunjoe
这个作者很懒,什么都没留下…
展开
-
面向对象设计原则、模式开篇
记得毕业后刚上班不久,一个同学打电话给我求救,说他正在做笔试题,要写几个常见的Design Pattern,然后问我什么是Design Pattern,叫我赶紧告诉他几个。身为菜鸟的我,要能回答如此问题还能叫菜鸟?因此要他自己搞定,结果可想而知,他面试杯具了。我也慢慢忘了这档事。然而不久后的一天,我面试时也被问到了这个Design Pattern,考官要我说下对于Design Pattern的原创 2011-07-19 17:36:12 · 766 阅读 · 0 评论 -
19.备忘录模式--Memento
Memento模式:Memento模式在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象回复到原先保存的状态。因为Memento模式把要保存的细节封装在Memento中了,需要更改保存的细节也不用影响客户端。Memento模式比较适合用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,可以根据保存的Me原创 2011-08-15 11:15:28 · 627 阅读 · 0 评论 -
20.中介模式--Mediator
Mediator模式:Mediator模式用一个中介对象来封装一系列的对象交互。中介者使各对象不需要现实地相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。Mediator模式典型的结构图为: Mediator模式的实现代码如下://Mediator.h#ifndef _MEDIATOR_H_#define _MEDIATOR_H_class Colle原创 2011-08-15 13:45:06 · 497 阅读 · 0 评论 -
21.命令模式--Command
Command模式:Command模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式的优点:第一、他能叫容易的设计一个命令队列;第二、在需要的情况下,可以较容易的将命令记入日志;第三、它允许接收请求的一方决定是否要否决请求;第四、可以容易的实现对请求的撤销和重做;第五、由于加进新的命令具体类不影响其他类,因此增加原创 2011-08-15 15:03:48 · 648 阅读 · 0 评论 -
01.单例模式--Singleton
Singleton模式:Singleton模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。比如读取并保存配置文件的类就只应该有一个实例。Singleton模式典型的结构图如下:Singleton模式比较简单,也很容易理解。所以不做太多解释,上源码,两种方式的实现代码://Singleton.h#ifndef _SINGLETON_H_#define _SI原创 2011-07-19 17:39:55 · 974 阅读 · 1 评论 -
02.工厂模式--Factory
Factory模式:Factory模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory模式使一个类的实例化延迟到其子类。在面向对象系统设计中经常可以遇到以下的两类问题:1) 为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的原创 2011-07-21 16:16:58 · 621 阅读 · 0 评论 -
04.C++反射的实现
C++本身是没有反射机制的,但C#和JAVA等语言内置反射机制。JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个原创 2011-07-25 11:34:07 · 1825 阅读 · 0 评论 -
05.抽象工厂模式+反射--AbstractFactory&Reflect
抽象工厂模式(AbstractFactory)和反射技术(Reflect)都在前面的笔记中记录了,现在将两个功能结合起来。还是以快餐店的食品为例子。首先,有快餐店的食品作为产品的基类,然后有鸡腿和汉堡两类食品,而鸡腿和汉堡又分肯德基的和麦当劳的。肯德基和麦当劳的汉堡和鸡腿是不同的,也就是说是不同的实现类型,合乎抽象工厂的使用场合。下面看具体的实现代码:// ReflectFactory原创 2011-07-25 11:35:19 · 892 阅读 · 0 评论 -
06.建造者模式--Builder
Builder模式:Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。 Builder模原创 2011-07-25 15:45:56 · 583 阅读 · 0 评论 -
22.访问者模式--Visitor
Visitor模式:Visitor模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。Visitor模式将有关的行为集中到一个访问者对象中,即将更新(变更)封装到一个类中(访问操作),并由待更改类提供一个接收接口。Visitor模式的目的是要把处理从数据结构分离出来。很多系统更可以按照算法和数据结构分开,如果这样的系统由比较稳定的数原创 2011-08-15 17:35:58 · 571 阅读 · 0 评论 -
25.解释器模式--Interpreter
Interpreter模式:Interpreter模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。Interpreter模式需要解决的的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。Interpreter模式可以很原创 2011-08-17 14:29:35 · 562 阅读 · 0 评论 -
23.职责链模式--Chain of Responsibility
Chain of Responsibility模式:Chain of Responsibility模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它。这就使得接收者和发送者都没有对方的明确信息,且链中的对原创 2011-08-17 13:33:58 · 542 阅读 · 0 评论 -
17.状态模式--State
State模式:State模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来好像是改变了其类。State模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。当然,如果这个状态判断很简单,那就没必要使用State模式了。State模式的好处是将与特定状态相关的行为局部化,并且将不同状态的原创 2011-08-10 14:56:19 · 497 阅读 · 0 评论 -
16.策略模式--Strategy
Strategy模式:Strategy模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。另外,策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。Strategy模式和Template模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算法)具体实现和抽象接口之间的解耦。Strategy模式将逻辑(算法)封装原创 2011-08-10 11:16:27 · 534 阅读 · 0 评论 -
15.模板模式--Template
Template模式:Template模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。我们既然是用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类去,而不是让每个子类都去重复。Template模式实际上就是利用面向对象中多态的概念实现算法实现细节和高层接口的松耦合。可以看到原创 2011-08-10 10:52:49 · 471 阅读 · 0 评论 -
18.观察者模式--Observer
Observer模式:Observer模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。Observer的一个实例Model/View/Control(MVC)结构在系统开发架构设计中有着很原创 2011-08-15 10:39:39 · 785 阅读 · 1 评论 -
03.抽象工厂模式--AbstractFactory
AbstractFactory模式:AbstractFactory模式用来提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在以下情况可以使用Abstract Factory模式• 一个系统要独立于它的产品的创建、组合和表示时。• 一个系统要由多个产品系列中的一个来配置时。• 当你要强调一系列相关的产品对象的设计以便进行联合使用时。• 当你提供一个产品类库原创 2011-07-25 11:32:17 · 635 阅读 · 0 评论 -
UML类图
参考《大话设计模式》简单记录一下UML类图的一些知识:类图:矩形框。分三层,第一层显示类的名称,如果为抽象类,则用斜体显示。第二层是类的特性,通常就是字段和属性。第三层是类的操作,通常是方法或行为,前面带‘+’表示public,‘-’表示private,‘#’表示protected。接口图:跟类图的差别就是顶端有>显示。接口还有一种棒棒糖表示法。类与类,类与接口的关系:继承:空心三原创 2011-07-25 12:04:08 · 555 阅读 · 0 评论 -
07.原型模式--Prototype
Prototype模式:Prototype模式用于指定创建对象的种类,并且通过拷贝这些原型创建新的对象。也就是说从一个对象再创建另外一个可以定制的对象,而且不需要知道任何创建的细节。它提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone()实现和具体的实现语言相关,在C++中我们将通过拷贝构造函数实现之。 一般在初始化的信息部发生变化的情况下,克隆是最好的办法,它隐藏原创 2011-07-25 16:50:31 · 610 阅读 · 0 评论 -
08.桥接模式--Bridge
Bridge模式:Bridge模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。这并不是说,让抽象类与其派生类分离,因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。比如手机既可以按照品牌来分类,也可以按照功能来分类。再通俗点“将抽象部分与它的实现部分分离”就是现实系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少它们之间的耦原创 2011-08-01 09:19:25 · 1080 阅读 · 0 评论 -
09.适配器模式--Adapter
Adapter模式:Adapter模式将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个借口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。通常在双方都不太容易修改的时候再使用适配器原创 2011-08-03 09:10:58 · 583 阅读 · 0 评论 -
10.装饰模式--Decorator
Decorator模式:Decorator模式动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。在OO设计和开发过程,可能会经常遇到以下的情况:我们需要为一个已经定义好的类添加新的职责(操作),通常的情况我们会给定义一个新类继承自定义好的类,这样会带来一个问题,新加的代码通常加入了新的字段,新的方法或新的逻辑,从而增加了类的复杂度,而些新加入的东西仅仅是为了满原创 2011-08-03 14:56:28 · 531 阅读 · 0 评论 -
11.组合模式--Composite
Composite模式:Composite模式将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。在Composite模式中,基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断递归下去,客户代码中,任何使用到基本对象的地方都可以使用组合对象了。当需求中是体现部分与整体层次的结构时,以及希望用户可以忽略组合对象与单原创 2011-08-09 09:45:55 · 648 阅读 · 0 评论 -
12.轻量模式--Flyweight
Flyweight模式(又叫享元模式):Flyweight模式运用共享技术有效地支持大量细粒度的对象。在Flyweight模式中,在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态,而随环境改变而改变的、不可以共享的状态就是外部状态了。享元模式可以避免大量非常相类似的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基原创 2011-08-09 11:28:46 · 699 阅读 · 0 评论 -
13.外观模式--Facade
Facade模式:Facade模式为子系统的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。Facade模式在什么时候使用最好呢?这要分三个阶段来说,首先,在设计初期阶段,应该要有意识的将不同的层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立Facade,这样可以为复杂的子系统提供一个简单的接口原创 2011-08-09 14:22:33 · 532 阅读 · 0 评论 -
14.代理模式--Proxy
Proxy模式:Proxy模式为其他对象提供一种代理以控制对这个对象的访问。Proxy一般分为三种:1. 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。2. 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。比如打开网页时,里面有很多文字和图片,但还是可以很快打开它,先看到的是文字,图片却是一张原创 2011-08-09 16:43:35 · 648 阅读 · 0 评论 -
24.迭代器模式--Iterator
Iterator模式:Iterator模式太常见了,在使用STL中就免不了要使用迭代器。Iterator提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。Iterator模式分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透原创 2011-08-17 13:51:32 · 618 阅读 · 0 评论