12 2012 档案
摘要:组合模式(Composition)组合模式(Composition)意图:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。应用:组合图形、文件目录、GUI容器等。模式结构:心得: 用户(Client)通过抽象类(Component)提供的公用接口统一操作基本对象(Leaf)和组合对象(Composite)。抽象对象应该拥有操作基本对象和组合对象的所有接口,但是基本对象应该屏蔽某些组合对象特有的操作,如添加删除等。组合对象聚合了多个抽象对象,这种一对多的关系和继承关系正好描述了一种树形的组合结构。举例: 抽象对象看作抽象出来的文件,Leaf看作具
阅读全文
摘要:策略模式(Strategy)策略模式(Strategy)[Policy]意图:定义一系列算法,把他们封装起来,并且使他们可以相互替换,使算法可以独立于使用它的客户而变化。应用:排序的比较方法、封装针对类的不同的算法、消除条件判断、寄存器分配算法等。模式结构:心得:对对象(Context)的处理操作可能有很多方式,这些方式很多情况下是同一类的处理操作,区别仅仅是操作的具体内容的差别。一般会通过条件分支判断不同的算法或者使用继承产生不同处理算法对应的对象。但是这么做的扩展性都很差,如果把对同一数据的不同处理方式封装起来,继承于统一的接口,就可以封装这些变化,达到扩展性的目的。举例:被处理的Con.
阅读全文
摘要:装饰者模式(Decorator)装饰者模式(Decorator)[Wrapper]意图:动态的给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。应用:给GUI组件添加功能等。模式结构:心得:装饰器(Decorator)和被装饰的对象(ConcreteComponent)拥有统一的接口,这个统一的接口正是被装饰对象需要扩展功能的地方,因此它们需要一个共同的接口(AbstractComponent)。另外为了完成装饰的目的,装饰器需要包含被装饰的对象,装饰器不直接包含被装饰对象,而是包含它们统一接口的引用,这样通过多态机制可以实现多层装饰。注意装饰器对抽象接口的关系是一对一的,这.
阅读全文
摘要:工厂方法模式(Factory Method)工厂方法模式(Factory Method)[Virtual Constructor]意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实力化延迟到子类。应用:多文档应用管理不同类型的文档。模式结构:心得:面对同一继承体系(Product派生)的类,简单工厂使用分支判断创建不同的子类对象(ConcreteProduct)。为了消除分支带来的扩展性问题,工厂方法提取工厂类的抽象接口(Creator),将对具体产品的实例化移动到子类(ConcreteCreator)中实现。而用户需要具体的产品对象时,只需要找到生产该类产品的工厂就可.
阅读全文
摘要:命令模式(Command)命令模式(Command)[Action/Transaction]意图:将一个请求封装为一个对象,从而可用不同的请求对客户参数化。对请求排队或记录请求日志,以及支持可撤消的操作。应用:用户操作日志、撤销恢复操作。模式结构:心得:命令对象的抽象接口(Command)提供的两个常见操作——执行和撤销,其他的命令对象要实现这个接口。命令模式使之上是将调用对象(Invoker)与被调用对象(Image、Text)之间的耦合关系解除。真正调用对象操作的是具体实现的命令对象,它把具体操作封装在execute内部,并为之实现了逆向的操作(如果可以的话)。而原先的调用者(invok.
阅读全文
摘要:迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图:提供一种方法顺序访问一个聚合对象中的每个元素,而又不想暴露该对象的内部表示。应用:STL标准库迭代器实现、Java集合类型迭代器等模式结构:心得:迭代器模式的目的是在不获知集合对象内部细节的同时能对集合元素进行遍历操作,单纯依靠集合对象内部提供遍历操作会将对象结构复杂化。另外,对象如果支持多种遍历方式,那么对象的成员函数会变得多而复杂。解决这种问题最好的方式是将这些变化封装在一个统一的对象中——Iterator,迭代其对象提供了迭代操作所必需的基本接口:初始化、递增操作、结束条件、返回当前元素[有点类似for循.
阅读全文
摘要:访问者模式(Visitor)访问者模式(Visitor)意图:表示一个作用于某对象结构中的各元素的操作,它使你在不改变各元素的类的前提下定义作用于这些元素的新操作。应用:作用于编译器语法树的语义分析算法。模式结构:心得:访问者模式是要解决对对象添加新的操作和功能时候,如何尽可能不修改对象的类的一种方法。一般为对象添加功能,是需要向对象添加成员函数。但这里对对象(ConcreteElement)添加了一个统一的接口——accept,来接收一个访问者对象。如何把对对象的操作移出到类外,正是接收参数(Visitor)的作用。它通过调用Visitor的接口函数visitConcreteElement.
阅读全文
摘要:生成器模式(Builder)生成器模式(Builder)意图:将一个对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。 应用:编译器词法分析器指导生成抽象语法树、构造迷宫等。模式结构:心得:和工厂模式不同的是,Builder模式需要详细的指导产品的生产。指导者(Director)使用Construct方法构造产品BuilderProduct,但是它不直接参与构造过程,而是把构造的任务交给生成器(Builder)。Builder提供了产品每一个部件构造的实现方法(可以是默认实现),但是如果要获得最终的产品,需要派生Builder的子类,添加getResult方法返回最终的产品对象.
阅读全文
摘要:原型模式(Prototype)原型模式(Prototype)意图:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。应用:Java/C#中的Clonable和IClonable接口等。模式结构:心得:原型模式本质上就是对象的拷贝,使用对象拷贝代替对象创建的原因有很多。比如对象的初始化构造非常复杂,消耗资源巨大;运行时对象状态变化不可重现;无法获得对象的成员的运行时值等。实现原型模式关键在于对象的正确复制,因此像高级语言实现的那样——支持复制接口。而对象的复制分为“深复制”和“浅复制”,前者除了复制对象本身数据外,还需要复制对象内指针引用的数据,后者则是仅仅复制对象数据。另外,深.
阅读全文
摘要:桥接模式(Bridge)桥接模式(Bridge)[Handle/Body]意图:将抽象部分与它的实现部分分离,使他们都可以独立的变化。应用:不同系统平台的Windows界面。模式结构:心得:用户所见类体系结构(Window派生)提供了一系列用户的高层操作的接口,但是这些接口的实现是基于具体的底层实现的(WindowImp)。我们不应该为不同的实现提供单独的代码,而应该将这些实现上的区别封装起来。WindowImp提供了合适数量和粒度的底层抽象,而实现这些接口的工作由具体的子类来做。这些底层抽象接口通过组合耦合的方式被高层类体系调用,而这一切对用户是透明的。高层类Window及其子类只需要使用.
阅读全文
摘要:抽象工厂模式(Abstract Factory)抽象工厂模式(Abstract Factory)[Kit]意图:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。应用:用户界面工具包。模式结构:心得:工厂方法把生产产品的方式封装起来了,但是一个工厂只能生产一类对象,当一个工厂需要生产多类产品的时候,就需要使用抽象工厂了。抽象工厂(AbstractFactory)类定义了一组标准的实现接口,这些接口一般都是和具体的产品类继承层次对应的。如createProductA接口只能生产抽象产品类(AbstratctProductA)的子类产品,因此抽象工厂的具体实现类之间的关系就是个.
阅读全文
摘要:适配器模式(Adapter)适配器模式(Adapter)[Wrapper]意图:将类的一个接口转换成用户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。应用:将图形类接口适配到用户界面组件类中。模式结构:心得:适配器模式一般应用在具有相似接口可复用的条件下。目标接口(Target)是需要适配器的实现的接口(输出),被适配的接口(Adaptee)拥有与目标接口不兼容的接口,适配器需要根据功能逻辑将Adaptee的接口“映射”Target接口上。使用多继承实现的方式成为类适配器,它通过公有继承Target接口,私有继承Adaptee接口实现。而针对对象的适配器稍显灵活,因.
阅读全文
摘要:单例模式(Singleton)单例模式(Singleton)意图:保证一个类只有一个实例,并提供一个访问它的全局访问点。应用:Session或者控件的唯一示例等。模式结构:心得:单例模式应该是设计模式中最简单的结构了,它的目的很简单,就是保证自身的实例只有一份。实现这种目的的方式有很多,在Java中使用懒汉方法、饿汉方法、内部私有类、单元素枚举、函数静态变量等实现。如果用C++实现单例模式,函数静态变量的方式可能整体的质量更好。举例:使用C++实现单例模式的代码如下:classSingleton{protected://禁用构造、拷贝、复制Singleton(){}Singleton(con.
阅读全文
摘要:设计模式学习心得《设计模式:可复用面向对象软件的基础》一书以更贴近读者思维的角度描述了GOF的23个设计模式。按照书中介绍的每个设计模式的内容,结合网上搜集的资料,我将对设计模式的学习心得总结出来。网络上关于设计模式的资料和文章汗牛充栋,有些文章对设计模式介绍生动形象。但是我相信“一千个读者,一千个...
阅读全文