2.4 抽象工厂
抽象工厂abstract factory1 概念别名 Kit 意图提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 结构抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。 抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 createProductA() 和 createProductB() 方法都是让子类来实现,这两个方法单独来看就是在创建一个对象,这符合工厂方法模式的定义。 至于创建对象的家族这一概念是在 Client 体现,Client 要通过 AbstractFactory 同时调用两个方法来创建出两个对象,在这里这两个对象就有很大的相关性,Client 需要同时创建出这两个对象。 从高层次来看,抽象工厂使用了组合,即 Cilent 组合了 AbstractFactory,而工厂方法模式使用了继承。 参与者AbstractFactory 声明一个创建抽象产品对象的操作接口。 Concrete...
3.2 桥接
桥接别名 Handle Body 意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 Decouple an abstraction from its implementation so that the two can varyindependently. 结构 参与者 Abstraction 定义抽象类的接口。 维护一个指向 Implementor 类型对象的指针。 RefinedAbstraction 扩充由 Abstraction 定义的接口。 Implementor 定义实现类的接口,该接口不一定要与 Abstraction接口完全一致,甚至可以完全不同。 Implementor 接口仅提供基本操作,Abstraction则定义了基于这些基本操作的较高层次的操作。 ConcreteImplementor 实现 Implementor 接口并定义它的具体实现。 适用性 在以下情况下可以使用 Bridge 模式: 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。比如需要在程序运行时刻实现部分应可以被选择或者切换。 类的抽...
3.4 装饰器
装饰器模式别名 包装器(Wrapper) 意图 动态地给一个对象添加一些额外的职责。 就增加功能来说,Decorator 模式相比生成子类更为灵活。 Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extendingfunctionality. 结构 参与者 Component 定义一个对象接口,可以给这些对象动态地添加职责。 ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。 Decorator 维持一个指向 Component 对象的指针,并定义一个与 Component 接口一致的接口。 ConcreteDecorator 向组件添加职责。 适用性 在以下情况下可以使用 Decorator 模式: 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 处理那些可以撤销的职责。 当不能采用生成子类的方法进行扩充时。 ...
3.7 代理
代理模式1 概念别名 Surrogate 意图为其他对象提供一种代理以控制对这个对象的访问。 Provide a surrogate or placeholder for another object to control access to it. 结构按照使用场景代理有以下四类: 远程代理(Remote Proxy):控制对远程对象(不同地址空间)的访问,它负责将请求及其参数进行编码,并向不同地址空间中的对象发送已经编码的请求。 虚拟代理(Virtual Proxy):根据需要创建开销很大的对象,它可以缓存实体的附加信息,以便延迟对它的访问,例如在网站加载一个很大图片时,不能马上完成,可以用虚拟代理缓存图片的大小信息,然后生成一张临时图片代替原始图片。 保护代理(Protection Proxy):按权限控制对象的访问,它负责检查调用者是否具有实现一个请求所必须的访问权限。 智能代理(Smart Reference):取代了简单的指针,它在访问对象时执行一些附加操作:记录对象的引用次数;当第一次引用一个对象时,将它装入内存;在访问一个实际对象前,检查是否已经锁定了它,以确...
4.1 责任链
责任链模式意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它位置。 Avoid coupling the sender of a request to its receiver by giving more than oneobject a chance to handle the request. Chain the receiving objects and pass the request along the chain until an objecthandles it. 结构 一个典型的对象结构可能如下图所示: 参与者 Handler 定义一个处理请求的接口。 实现后继链 ConcreteHandler 处理它所负责的请求。 可访问它的后继者。 如果可处理该请求,就处理;否则将该请求转发给它的后继者。 Client 向链上的具体处理者对象提交请求。 适用性 在以下情况下可以使用 Chain of Responsibility 模式: 有多个对象可以...
4.10 模板方法
意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 结构 参与者 AbstractClass 定义抽象的原语操作(PrimitiveOperation),具体的子类将重定义它们以实现一个算法的各步骤。 实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义在类中的其他操作。 ConcreteClass 实现原语操作以完成算法中与特定子类相关的步骤。 适用性 在以下情况下可以使用 Template Method 模式: 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。 控制子类扩展。只允许特定的点进行扩展。 效果 模板方法是一种代码复用的基本技术。 “好莱坞法则:Don’t call us, we’ll callyou.”,一个父类调用一个子类的操作,而不是相反。 相关模式 Factory Method 常被 Template Method...
4.11 访问者
访问者模式意图 表示一个作用于某对象结构中的各元素的操作。 Visitor 使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of theelements on which it operates. 结构 参与者 Visitor 为该对象结构中 ConcreteElement 的每一个类声明一个 Visit 操作。该操作的名字和特征标识了发送 Visit 请求给该访问者的那个类。 ConcreteVisitor 实现每个由 Visitor 声明的操作。 Element 定义一个 Accept 操作,它以一个 Visitor 为参数。 ConcreteElement 实现 Accept 操作,该操作以一个 Visitor 为参数。 ObjectStructur...
4.3 解释器
意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 Given a language, define a represention for its grammar along with aninterpreter that uses the representation to interpret sentences in the language. 结构 参与者 AbstractExpression 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。 TerminalExpression 实现与文法中的终结符相关联的解释操作。 一个句子中的每一个终结符需要该类的一个实例。 NonterminalExpression 对文法中的规则的解释操作。 Context 包含解释器之外的一些全局信息。 Client 构建表示该语法定义的语言中一个特定的句子的抽象语法树。 调用解释操作 适用性 当有个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可以使用Interpreter 模...
4.4 迭代器
迭代器概念意图提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。 结构 参与者Iterator 迭代器定义访问和遍历元素的接口。 ConcreteIterator 具体迭代器实现迭代器接口。 对该聚合遍历时跟踪当前位置。 Aggregate 聚合定义创建相应迭代器对象的接口。 ConcreteAggregate 具体聚合实现创建相应迭代器的接口,该操作返回 ConreteIterator 的实例。 适用性在以下情况下可以使用 Iterator 模式: 访问一个聚合对象的内容而无需暴露它的内部表示。 支持对聚合对象的多种遍历。 为遍历不同的聚合结构提供一个统一的接口。 效果 它支持以不同的方式遍历一个聚合。 迭代器简化了聚合的接口。 在同一个聚合上可以有多个遍历。 相关模式 Iterator 常被应用到 Composite 这样的递归结构上。 可以使用 Factory Method 模式来实例化多态迭代器。 Iterator 可以使用 Memento 来捕获一个迭代的状态,在内部存储 Memento。 Imple...
4.5 中介者
意图 用一个中介对象来封装一系列的对象交互。 中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each otherexplicitly, and it lets you vary their interaction independently. 结构 一个典型的对象结构: 参与者 Mediator 中介者定义一个接口用于与各同事对象通信。 ConcreteMediator 具体中介者通过协调各同事对象实现协作行为。 了解并维护它的各个同事。 Colleague 每一个同事类都知道它的中介者。 每一个同事对象在需与其他同事通信时,与它的中介者通信。 适用性 在以下情况下可以使用 Mediator 模式: 一组对象定义良好但是使用复杂的通信方式。产生的...














