随笔分类 -  Design Pattern

摘要:传送门☞轮子的专栏☞转载请注明☞http://blog.csdn.net/leverage_12291概述 定义一系列算法,把它们一个个都封装起来,并且让它们可以相互替换。策略模式使得算法可以独立于使用它的客户而发生变化。2适用性(1)许多相关的类仅仅是行为存在差异的时候。“策略”提供了一种使用多个行为中的一个来配置一个类的方法。(2)需要使用一个算法的不同变体的时候。(3)算法使用了客户不应该知道的数据的时候。以避免暴露复杂的、与算法相关的数据结构。(4)一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现的时候。将相关的条件分支移入它们各自的Strategy类中... 阅读全文
posted @ 2013-06-13 23:35 Innosight 阅读(199) 评论(0) 推荐(0)
摘要:概述 表示一个作用于某对象结构中的各元素的操作。 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 适用性 1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。 2.需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。 Visitor使得你可以将相关的操作集中起来定义在一个类中。 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。 3.定义对象结构的类很少改变,但经常需要在此结构上定义新的操作... 阅读全文
posted @ 2013-06-06 14:19 Innosight 阅读(214) 评论(0) 推荐(0)
摘要:概述 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 适用性 1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。 2.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。 首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。 最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。 3.控制子类扩展。 参与者 1.AbstractClass 定义抽象的原... 阅读全文
posted @ 2013-06-05 22:24 Innosight 阅读(179) 评论(0) 推荐(0)
摘要:一、概述 将一个请求封装为一个对象,从而可以使用不同的请求对客户端进行参数化。对请求排队或记录请求日志,以及支持撤销的操作。二、适用性1.当抽象出待执行的动作以参数化某个对象的时候。2.当需要在不同的时刻指定、排列和执行请求的时候。3.当需要支持撤销操作的时候。4.当需要支持修改日志的时候。系统崩溃时,这些修改可以重做一遍。5.当用构建在原语操作上的高层操作构造一个系统的时候。三、参与者1.Command:声明执行操作的接口。2.ConcreteCommand:将一个接收者对象绑定于一个动作。调用接收者相应操作来完成要执行的操作。3.Client:创建一个具体命令对象并且设定它的接收者。... 阅读全文
posted @ 2013-06-03 22:39 Innosight 阅读(215) 评论(0) 推荐(0)
摘要:一、概述 给定一种语言和其文法的一种表示,再定义一个解释器,该解释器使用表示来解释语言中的句子。二、适用性 当需要解释一种语言,并且可以将该语言中的句子表示为一个抽象语法树的时候。1.该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。2.效率不是一个关键问题,最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。三、参与者1.AbstractExpression:声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。2.TerminalExpression:实现与文法中的终结符相关联的解释操作。一个句子中的每个终结符需要该... 阅读全文
posted @ 2013-06-03 14:41 Innosight 阅读(200) 评论(0) 推荐(0)
摘要:一、概述 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并且沿着这条链传递请求,直到有一个对象处理它为止。其设计思想是:给对多个对象处理一个请求的机会,从而解耦请求发送者和接收者。二、适用性1.有多个对象可以处理一个请求,到底是哪个对象处理请求,交由运行时刻自动确定的时候。2.你想在不明确指定接收者的情况下,向多个对象中的一个发送请求的时候。3.可以处理一个请求的对象集合应该被动态指定的时候。三、参与者1.Handler:定义一个处理请求的接口。可能的话实现后继链(option)。2.ConcreteHandler:链上的具体处理者。处理它... 阅读全文
posted @ 2013-06-03 14:37 Innosight 阅读(246) 评论(0) 推荐(0)
摘要:一、概述 为其他对象提供一种代理以控制对这个对象的访问。二、适用性1.远程代理(RemoteProxy):为一个对象在不同的地址空间土工局部代表。2.虚代理(VirtualProxy):根据需要创建开销很大的对象。3.保护代理(ProtectionProxy):控制对原始对象的访问。4.智能代理(SmartReference):取代简单的指针,在访问对象时执行一些附加操作。三、参与者1.Proxy:保存一个引用使得代理可以访问实体。若RealSubject和Subject的接口相同,Proxy会引用Subject。提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。控制... 阅读全文
posted @ 2013-05-31 12:13 Innosight 阅读(238) 评论(0) 推荐(0)
摘要:一、概述 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。二、适用性1.当你要为一个复杂子系统提供一个简单接口的时候。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。外观模式可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过外观层。2.客户程序与抽象类的实现部分之间存在着很大的依赖性的时候。引入外观模式将这个子系统与客户以及其他的子系统分离,可以提高.. 阅读全文
posted @ 2013-05-31 12:11 Innosight 阅读(289) 评论(0) 推荐(0)
摘要:一、概述 动态地给一个对象添加一些额外的职责。装饰模式比生成子类更为灵活。二、适用性1.在不影响其他对象的情况下,以动态、透明的方式给但个对象添加职责。2.处理那些可以撤销的职责。3.当不能采用生成子类的方式进行扩展的时候。三、参与者1.Component:定义一个对象接口,可以给这些对象动态地添加职责。2.ConcreteComponent:定义一个对象,可以给这个对象添加一些职责。3.Decorator:维持一个指向Component对象的指针,并且定义一个与Component接口一致的接口。4.ConcreteDecorator:向组件添加职责。四、类图五、示例Componentp... 阅读全文
posted @ 2013-05-31 12:10 Innosight 阅读(205) 评论(0) 推荐(0)
摘要:一、概述 将对象组合成树型结构以表示“部分--整体”的层次关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。二、适用性1.你想表示对象的部分--整体层次结构的时候。2.你希望用户忽略组合对象与单个对象的不同的时候,用户将统一地使用组合结构中的所有对象。三、参与者1.Component:为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子组件。在递归结构中定义一个接口,用于访问一个父部件,并且在适当的情况下实现它。2.Leaf:在组合中表示叶节点对象,叶节点没有子节点。在组合中定义节点对象的行为。3.Composi... 阅读全文
posted @ 2013-05-31 12:09 Innosight 阅读(236) 评论(0) 推荐(0)
摘要:一、概述 将类的抽象部分与实现分部分离开来,使它们都可以独立地变化。二、适用性1.你不希望在抽象和实现之间有一个固定的绑定关系的时候。例如:在程序运行时实现部分应可以被选择或切换。2.类的抽象以及实现都应该可以通过生成子类的方法加以扩充的时候。桥接模式使你可以对不同的抽象接口和实现进行组合,并且分别对它们进行扩充。3.对一个抽象的实现部分的修改应对客户不产生影响的时候,即客户的代码不必重新编译。4.你必须将一个对象分解成两个部分的时候。5.你想在多个对象间共享实现(可能使用引用计数),但是同时要求客户并不知情的时候。三、参与者1.Abstraction:定义抽象类的接口。维护一个指向Im... 阅读全文
posted @ 2013-05-31 12:08 Innosight 阅读(216) 评论(0) 推荐(0)
摘要:一、概述 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。二、适用性1.你想使用一个已经存在的类,但是它的接口不符合你的要求的时候。2.你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口肯不一定兼容的类)协同工作的时候。3.你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口的时候。对象适配器可以适配它的父类接口。三、参与者1.Target:定义Client使用的与特定领域相关的接口。2.Adaptee:定义一个已经存在的接口,该接口需要适配。3.Adapter:对Adapte... 阅读全文
posted @ 2013-05-31 04:07 Innosight 阅读(195) 评论(0) 推荐(0)
摘要:一、概述 运用共享技术有效地支持大量细粒度的对象。二、适用性1.当一个应用程序使用了大量的对象的时候。2.由于使用大量的独享而造成很大的存储开销的时候。3.对象的大多数状态都可变为外部状态的时候。4.如果删除对象的外部状态,那么可以用相对较少的共享独享取代很对组对象的时候。5.应用程序不依赖于对象标识的时候。由于享元模式对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。三、参与者1.Flyweight:描述一个接口,通过这个接口Flyweight可以接受和作用于对象外部状态。2.ConcreteFlyweight:实现Flyweight接口,并为内部状态(如果有)增加存储空间... 阅读全文
posted @ 2013-05-30 20:12 Innosight 阅读(220) 评论(0) 推荐(0)
摘要:1概述 保证一个类仅有一个实例,并提供一个访问它的全局访问点。2适用性1.当类只能有一个实例而且客户可以从一个总所周知的访问点访问它的时候。2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例的时候。3参与者Singleton:定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类的操作,可能复杂创建它自己的唯一实例。4类图5示例Singletonpackage cn.lynn.singleton; public class Singleton { private static Singleton instanc... 阅读全文
posted @ 2013-05-30 16:09 Innosight 阅读(178) 评论(0) 推荐(0)
摘要:一、概述 将一个复杂对象的构建与其表示分离开来,使得同样的构建过程可以创建不同的表示。二、适用性1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式的时候。2.当构造过程必须允许被构造的对象有不同的表示的时候。三、参与者1.Builder:为创建一个Product对象的各个部件指定抽象接口。2.ConcreteBuilder:实现Builder接口以构造和装配该产品的各个部件。3.Director:构造一个使用Builder接口的对象。4.Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包括定义组成部件的类,以及... 阅读全文
posted @ 2013-05-30 07:19 Innosight 阅读(246) 评论(0) 推荐(0)