设计模式之组成模式
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 2 ) 共享组件 共享组件是很有用的,比如可以
减少对存贮的需求。但是当一个组件只有一个父部 件时,很难共享组件。一个可行的解决办法是为子 部件存贮多个父部件,但当一个请求在结构中向上 传递时,这种方法会导致多义性。
HPM&S
组合模式(COMPOSITE)
}
}
HPM&S
组合模式(COMPOSITE)
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 5) Component是否应该实现一个 Component列表
你可能希望在Component类中将子节点集合定义为 一个实例变量,而这个 Component类中也声明了一 些操作对子节点进行访问和管理。但是在基类中存 放子类指针,对叶节点来说会导致空间浪费,因为 叶节点根本没有子节点。只有当该结构中子类数目 相对较少时,才值得使用这种方法。
HPM&S
组合模式(COMPOSITE)
三、组合模式的动机:
HPM&S
组合模式(COMPOSITE)
四、组合模式的适用性: 以下情况下适用Composite模式: 1).你想表示对象的部分-整体层次结构 2).你希望用户忽略组合对象与单个对象的不同, 用户将统一地使用组合结构中的所有对象。
HPM&S
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例: //组合部件类
public class StoreOrBranch : Storefront { //构造函数 public StoreOrBranch() { } public StoreOrBranch(string storeName) { this.storeName = storeName; }
storeName); foreach (Storefront sf in myStoreList) { sf.PayByCard(); }
}
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例:
//增加店面 public override void Add(Storefront store) { myStoreList.Add(store); } //解除店面 public override void Remove(Storefront store) { myStoreList.Remove(store); }
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例:
List<Storefront> myStoreList = new List<Storefront>(); //刷卡消费 public override void PayByCard() { Console.WriteLine("店面{0}的积分已累加进该会员卡",
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 4)声明管理子部件的操作 虽然Composite类实
现了Add 和Remove操作用于管理子部件,但在 Composite模式中一个重要的问题是:在 Composite 类层次结构中哪一些类声明这些操作。这需要在安 全性和透明性之间做出权衡选择。
八、组合模式的实现: 3) 最大化Component接口 Composite模式的目的
之一是使得用户不知道他们正在使用的具体的Leaf 和Composite类。为了达到这一目的, Component类 应为Leaf 和Composite类尽可能多定义一些公共操 作。 Component类通常为这些操作提供缺省的实现 而 Leaf 和Composite子类可以对它们进行重定义。
七、组合模式的效果: 1) 基本对象可以被组合成更复杂的组合对象,
而这个组合对象又可以被组合,这样不断的递归下 去。客户代码中,任何用到基本对象的地方都可以 使用组合对象。
2) 简化客户代码,客户可以一致地使用组合结 构和单个对象。在定义组合结构的那些类中不需要 写一些充斥着选择语句的函数。
HPM&S
}
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例: //叶子节点
public class JoinInStore : Storefront {
//构造函数 public JoinInStore() { } public JoinInStore(string storeName) {
组合模式(COMPOSITE)
五、组合模式的结构:
HPM&S
组合模式(COMPOSITE)
六、组合模式的参与者: 抽象构件角色(component):是组合中的对
象声明接口,在适当的情况下,实现所有类共有接 口的默认行为。声明一个接口用于访问和管理 Component子部件。
树叶构件角色(Leaf):在组合树中表示叶节点 对象,叶节点没有子节点。并在组合中定义图元对 象的行为。
制的语言中,当一个Composite被销毁时,通常最 好由Composite 负责删除其子节点。但有一种情况 除外,即 Leaf对象不会改变,因此可以被共享。
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 9)存贮组件最好用哪一种数据结构 Composite
可使用多种数据结构存贮它们的子节点,包括连接 列表、树、数组和 h a s h表。数据结构的选择取决 于效率。有时对每个子节点, Composite都有一个 变量与之对应,这就要求 Composite的每个子类都 要实现自己的管理接口。
九、组合模式的代码示例: //抽象的部件类描述将来所有部件共有的行为
public abstract class Storefront { //店名 protected string storeName = string.Empty; public string StoreName { get { return storeName;
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例:
//添加店面 public abstract void Add(Storefront store); //删除店面 public abstract void Remove(Storefront store);
//定义所有部件公用的行为 刷卡行为 public abstract void PayByCard(); }
设计模式概述
HPM&S
设计模式的思想
设计模式就是综合运用面向对象技术和特性来提高 业务逻辑可复用性的常用方法和经验的提取和汇总, 是对在一定环境下反复出现问题的解决方案。
▪ 设计模式的优点
使人们更加简单方便地复用成功的设计和体系结构, 更容易理解成功者的设计思路,帮助开发者做出有利 于系统复用的选择,通过提供类和对象作用关系以及 它们之间潜在联系的说明规范,帮助设计者更快更好 地完成系统设计。
设计模式的分类
HPM&S
HPM&S
结构型设计模式简介
结构型模式——结构型设计模式是从程序结构上解决 模块之间的耦合问题。结构型模式涉及到如何组合类 和对象以获得更大的结构。结构型类模式采用继承机 制来组合接口或实现。结构型对象模式不是对接口和 实现进行组合,而是描述了如何对一些对象进行组合, 从而实现新功能的方法。因为可以在运行时刻改变对 象组合关系,所以对象组合方式具有更大的灵活性, 而这种机制用静态类组合是不可能实现的。
this.storeName = storeName; }
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例:
//刷卡消费
public override void PayByCard()
{
Console.WriteLine("店面{0}的积分已累加进该会员卡", storeName);
HPM&S
组合模式(COMPOSITE)
一、组合模式要解决的问题: 我们可以把一些简单对象定义成类,然后定义一些 容器类来存储这些简单对象。客户端代码必须区别 简单对象和容器对象,而实际上大多数情况下用户 认为它们是一样的。对这些对象区别使用,使得程 序更加复杂。递归使用的时候更麻烦,问题是我们 如何让用户不必对这些对象进行区别。
八、组合模式的实现: 7)使用高速缓冲存贮改善性能 如果你需要对
组合进行频繁的遍历或查找, Composite类可以缓 冲存储对它的子节点进行遍历或查找的相关信息。 Composite可以缓冲存储实际结果或者仅仅是一些 用于缩短遍历或查询长度的信息。
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 8) 应该由谁删除Component 在没有垃圾回收机
}
public override void Add(Storefront store)
{
throw new NotImplementedException();
}
public override void Remove(Storefront store)
{
throw new NotImplementedException();
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 1 )显式的父部件引用。保持从子部件到父部件
的引用能简化组合结构的遍历和管理。父部件引用 可以简化结构的上移和组件的删除。通常在 Component类中定义父部件引用。 L e a f和 Composite类可以继承这个引用以式(COMPOSITE)