3.3 组合
组合模式意图 将对象组合成树形结构以表示 “部分-整体” 的层次结构。 Composite 使得用户对于单个对象和组合对象的使用具有一致性。 Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objectsuniformly. 结构 典型的 Composite 对象结构: 参与者 Component 为组合中的对象声明接口。 在适当的情况下,实现所有类共有接口的缺省行为 声明一个接口用于访问和管理 Component 的子组件。 在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。 Leaf 在组合中表示叶节点对象,叶节点没有子节点。 在组合中定义图元对象的行为。 Composite 定义有子部件的那些部件的行为。 在 Composite 接口中实现与子部件有关的操作。 Client 通过 Comp...
4 行为型设计模式
行为型模式涉及到算法和对象间职责的分配。1 概述目标行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。 这些模式刻划了在运行时难以跟踪的复杂的控制流。它们将你的注意力从控制流转移到对象间的联系方式上来。 行为类模式使用继承机制在类间分派行为。 行为对象模式使用对象复合而不是继承。描述一组对等的对象怎样相互协作以完成任一个对象都无法完成的任务。 2 行为型模式Chain of Responsibility(职责链) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它位置。 Command(命令) 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 Interpreter(解释器) 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 Iterator(迭代器) 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。 Observer(观察者) ...
4.12 空对象
意图 通过对缺失对象的封装,以提供默认无任何行为的对象替代品。 Encapsulate the absence of an object by providing a substitutable alternativethat offers suitable default do nothing behavior. In short, a design where “nothing will come of nothing”. 结构 参与者 AbstractObject 声明协作对象的接口。 如果需要,可以实现默认行为。 RealObject 具体的协作对象类,提供有意义的行为。 NullObject 空对象类,继承自 AbstractObject,但接口实现不做任何事情。 Client 请求协作对象。 适用性 当以下情况成立时可以使用 Null Object 模式: 一个对象需要一个协作对象,但并无具体的协作对象。 协作对象不需要做任何事情。 效果 减少了对对象是否为 Null 的判断。 提供默认无任何具体行为的协作对象。 相关模式 因为...
5.1 Dynamic Property(动态属性)
索引 别名 意图 结构 参与者 适用性 效果 实现 实现方式(一):Dynamic Property 的示例实现。 别名 Property Properties Property List 意图 使对象可以为客户提供广泛且可扩展的属性集合。 Lets an object provides a generic and extensible set of properties to clients. 结构 参与者 Object 目标对象可存储 Property 列表。 可使用不同的类型来作为 Property 的标识符,最简单的可以使用 string 类型。 Property 属性定义。 适用性 当以下情况成立时可以使用 Dynamic Property 模式: 当对象需要定义大量属性时。 当对象的属性是运行时可变时。 效果 可在运行时动态的修改对象的属性。 实现 实现方式(一):Dynamic Property 的示例实现。 复制代码 1 namespace DynamicPropertyPattern.Implement...
5.2 Extension Object(扩展对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用示例结构实现 Extension Object。 实现方式(二):使用泛型实现 IExtensibleObject<T> 接口。 意图 预期对象的接口将在未来被扩展。通过额外的接口来定义扩展对象。 Anticipate that an object’s interface needs to be extended in the future. Additional interfaces are defined by extension objects.. 结构 参与者 Subject 定义抽象主体对象。其定义用于查询是否包含特定扩展的接口。 Extension 所有扩展类的抽象基类。可以定义负责管理扩展自身的操作。 Extension 知道其是谁的扩展。 ConcreteSubject 具体的主体类。实现基类定义的 GetExtension 方法并返回相应的扩展对象。 AbstractExtension 特定种类的扩展类的抽象基类。 Concre...
5.3 Manager(管理器)
索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现。 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中。 这使得管理职责的变化独立于类本身,并且管理器还可以为不同的类进行重用。 Encapsulates management of a class’s objects into a separate manager object. This allows variation of management functionality independent of the class andthe manager’s reuse for different classes. 结构 参与者 Subject 领域对象。 提供 Client 需要的领域服务。 Manager Manager 类是唯一负责创建和销毁 Subject 对象的类。它负责跟踪和管理 Subject对象。 典型的管理职责包括根据指定的 Key 搜索 Subject 对象。 因为 Subject 对 Manager 无引用,所以 Man...
5.4 Object Pool(对象池)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类。 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool 类。 意图 运用对象池化技术可以显著地提升性能,尤其是当对象的初始化过程代价较大或者频率较高时。 Object pooling can offer a significant performance boost; it is most effectivein situations where the cost of initializing a class instance is high, the rateof instantiation of a class is high. 结构 参与者 Reusable 类的实例与其他对象进行有限时间的交互。 ReusablePool 管理类的实例。 Client 使用类的实例。 适用性 当以下情况成立时可以使用 Object Pool 模式: 类的实例可重用于交互。 类的实例化过程开销较大。 ...
5.6 Product Trader(操盘手)
设计模式之美:Product Trader(操盘手) 索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Product Trader 的示例实现。 意图 使客户程序可以通过命名抽象超类和给定规约来创建对象。 Product Trader 让客户程序与 Product类解耦,从而使得类的层级结构、框架和应用程序易于改写、配置和演进。 Let clients create objects by naming an abstract superclass and by providing aspecification. A Product Trader decouples the client from the product and thereby eases theadaption, configuration and evolution of class hierarchies, frameworks andapplications. 结构 参与者 Client 为 ConcreteProduct 类创建 Specification。...
5.5 Private Class Data(私有类数据)
索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):实现对初始化数据的封装。 意图 封装类的初始化数据,控制对类的属性的更改,并保持类数据与使用数据的方法间的隔离。 Encapsulate class data initialization, control write access to class attributesand separate data from methods that use it. 结构 参与者 MainClass 根据构造函数参数列表构造 DataClass 类的实例。 DataClass 封装数据。 适用性 当以下情况成立时可以使用 Private Class Data 模式: 类的初始化数据是一次性的不可修改的数据。 需要控制对类的初始化数据的更改。 预防对初始化数据的不必要的更改。 效果 减少类对外暴露的属性。 从类中移除了对数据的写权限。 实现 实现方式(一):实现对初始化数据的封装。 复制代码 1 namespace PrivateClassDataPattern.Implement...
5.7 Role Object(角色对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Role Object 的示例实现。 意图 通过明确地附加角色对象到目标对象中,以使对象可以适配不同的客户需求。每个角色对象都代表着目标对象在客户上下文中的一种角色。每种上下文都存在于特定的应用程序中,因此可使对象在不同的应用程序间解耦。 Adapt an object to different client’s needs through transparently attached roleobjects, each one representing a role the object has to play in that client’scontext. Each context may be its own application, which therefore gets decoupledfrom the other applications. 结构 参与者 Component 定义关键的抽象接口。 定义添加、删除、测试和查询角色对象的接口协议。Client 可以指定...














