设计模式之组成模式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
组合模式(COMPOSITE)
七、组合模式的效果: 3) 使得更容易增加新类型的组件,新定义的
Composite或Leaf子类自动地与已有的结构和客户代 码一起工作,客户程序不需因新的子类而改变。
4) 很难限制组合中的组件。有时你希望一个组 合只能有某些特定的组件。使用Composite时,你 不能依赖类型系统施加这些约束,而必须在运行时 刻进行检查。
this.storeName = storeName; }
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例:
//刷卡消费
public override void PayByCard()
{
Console.WriteLine("店面{0}的积分已累加进该会员卡", storeName);
HPM&S
组合模式(COMPOSITE)
三、组合模式的动机:
HPM&S
组合模式(COMPOSITE)
四、组合模式的适用性: 以下情况下适用Composite模式: 1).你想表示对象的部分-整体层次结构 2).你希望用户忽略组合对象与单个对象的不同, 用户将统一地使用组合结构中的所有对象。
HPM&S
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例: 根据会员卡的消费,来模拟组合模式的实现。首先: 1.我们的部件有,总店,分店,加盟店 2.我们的 部件共有的行为是:刷会员卡 3.部件之间的层次 关系是,总店下有分店、分店下可以拥有加盟店。
HPM&S
组合模式(COMPOSITE)
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例:
//添加店面 public abstract void Add(Storefront store); //删除店面 public abstract void Remove(Storefront store);
//定义所有部件公用的行为 刷卡行为 public abstract void PayByCard(); }
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例: //组合部件类
public class StoreOrBranch : Storefront { //构造函数 public StoreOrBranch() { } public StoreOrBranch(string storeName) { this.storeName = storeName; }
八、组合模式的实现: 3) 最大化Component接口 Composite模式的目的
之一是使得用户不知道他们正在使用的具体的Leaf 和Composite类。为了达到这一目的, Component类 应为Leaf 和Composite类尽可能多定义一些公共操 作。 Component类通常为这些操作提供缺省的实现 而 Leaf 和Composite子类可以对它们进行重定义。
HPM&S
组合模式(COMPOSITE)
一、组合模式要解决的问题: 我们可以把一些简单对象定义成类,然后定义一些 容器类来存储这些简单对象。客户端代码必须区别 简单对象和容器对象,而实际上大多数情况下用户 认为它们是一样的。对这些对象区别使用,使得程 序更加复杂。递归使用的时候更麻烦,问题是我们 如何让用户不必对这些对象进行区别。
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)
九、组合模式的代码示例: //叶子节点
public class JoinInStore : Storefront {
//构造函数 public JoinInStore() { } public JoinInStore(string storeName) {
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 4)声明管理子部件的操作 虽然Composite类实
现了Add 和Remove操作用于管理子部件,但在 Composite模式中一个重要的问题是:在 Composite 类层次结构中哪一些类声明这些操作。这需要在安 全性和透明性之间做出权衡选择。
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例:
List<Storefront> myStoreList = new List<Storefront>(); //刷卡消费 public override void PayByCard() { Console.WriteLine("店面{0}的积分已累加进该会员卡",
设计模式概述
HPM&S
设计模式的思想
设计模式就是综合运用面向对象技术和特性来提高 业务逻辑可复用性的常用方法和经验的提取wk.baidu.com汇总, 是对在一定环境下反复出现问题的解决方案。
▪ 设计模式的优点
使人们更加简单方便地复用成功的设计和体系结构, 更容易理解成功者的设计思路,帮助开发者做出有利 于系统复用的选择,通过提供类和对象作用关系以及 它们之间潜在联系的说明规范,帮助设计者更快更好 地完成系统设计。
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 5) Component是否应该实现一个 Component列表
你可能希望在Component类中将子节点集合定义为 一个实例变量,而这个 Component类中也声明了一 些操作对子节点进行访问和管理。但是在基类中存 放子类指针,对叶节点来说会导致空间浪费,因为 叶节点根本没有子节点。只有当该结构中子类数目 相对较少时,才值得使用这种方法。
HPM&S
组合模式(COMPOSITE)
二、组合模式的意图: 将对象组合成树形结构,以表示“整体和部分”的 层次结构。组合模式使得用户对单个对象和组合对 象的使用具有一致性。它使我们在树型结构的问题 中,模糊了简单元素和复杂元素的概念,客户程序 可以像处理简单元素一样来处理复杂元素,从而使 得客户程序与复杂元素的内部结构解耦。
HPM&S
组合模式(COMPOSITE)
三、组合模式的动机: 然而这种方法存在一个问题:使用这些类的代码必 须区别对待图元对象与容器对象,而实际上大多数 情况下用户认为它们是一样的。对这些类区别使用, 使得程序更加复杂。组合模式描述了如何使用递归 组合,使得用户不必对这些类进行区别,如下图所 示。
制的语言中,当一个Composite被销毁时,通常最 好由Composite 负责删除其子节点。但有一种情况 除外,即 Leaf对象不会改变,因此可以被共享。
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 9)存贮组件最好用哪一种数据结构 Composite
可使用多种数据结构存贮它们的子节点,包括连接 列表、树、数组和 h a s h表。数据结构的选择取决 于效率。有时对每个子节点, Composite都有一个 变量与之对应,这就要求 Composite的每个子类都 要实现自己的管理接口。
七、组合模式的效果: 1) 基本对象可以被组合成更复杂的组合对象,
而这个组合对象又可以被组合,这样不断的递归下 去。客户代码中,任何用到基本对象的地方都可以 使用组合对象。
2) 简化客户代码,客户可以一致地使用组合结 构和单个对象。在定义组合结构的那些类中不需要 写一些充斥着选择语句的函数。
HPM&S
HPM&S
组合模式(COMPOSITE)
六、组合模式的参与者: 树枝构件角色(Composite):定义有子部件的
那些部件的行为。存储子部件。在Composite接口 中实现与子部件有关的操作。
客户角色(Client):通过component接口操纵 组合部件的对象。
HPM&S
组合模式(COMPOSITE)
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 6) 子部件排序 许多设计指定了Composite的子
部件顺序。在前面的 Graphics例子中,排序可能表 示了从前至后的顺序。如果需要考虑子节点的顺序 时,必须仔细地设计对子节点的访问和管理接口, 以便管理子节点序列。
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例: //抽象的部件类描述将来所有部件共有的行为
public abstract class Storefront { //店名 protected string storeName = string.Empty; public string StoreName { get { return storeName;
八、组合模式的实现: 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
HPM&S
结构型设计模式简介
结构型模式——结构型设计模式是从程序结构上解决 模块之间的耦合问题。结构型模式涉及到如何组合类 和对象以获得更大的结构。结构型类模式采用继承机 制来组合接口或实现。结构型对象模式不是对接口和 实现进行组合,而是描述了如何对一些对象进行组合, 从而实现新功能的方法。因为可以在运行时刻改变对 象组合关系,所以对象组合方式具有更大的灵活性, 而这种机制用静态类组合是不可能实现的。
}
}
HPM&S
组合模式(COMPOSITE)
HPM&S
组合模式(COMPOSITE)
三、组合模式的动机: 在绘图编辑器和图形捕捉系统这样的图形应用程序 中,用户可以使用简单的组件创建复杂的图表。用 户可以组合多个简单组件以形成一些较大的组件, 这些组件又可以组合成更大的组件。一个简单的实 现方法是为 Te x t和L i n e这样的图元定义一些类, 另外定义一些类作为这些图元的容器类( C o n t a i n e r )。
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 2 ) 共享组件 共享组件是很有用的,比如可以
减少对存贮的需求。但是当一个组件只有一个父部 件时,很难共享组件。一个可行的解决办法是为子 部件存贮多个父部件,但当一个请求在结构中向上 传递时,这种方法会导致多义性。
HPM&S
组合模式(COMPOSITE)
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 1 )显式的父部件引用。保持从子部件到父部件
的引用能简化组合结构的遍历和管理。父部件引用 可以简化结构的上移和组件的删除。通常在 Component类中定义父部件引用。 L e a f和 Composite类可以继承这个引用以及管理这个引用 的那些操作。
组合模式(COMPOSITE)
五、组合模式的结构:
HPM&S
组合模式(COMPOSITE)
六、组合模式的参与者: 抽象构件角色(component):是组合中的对
象声明接口,在适当的情况下,实现所有类共有接 口的默认行为。声明一个接口用于访问和管理 Component子部件。
树叶构件角色(Leaf):在组合树中表示叶节点 对象,叶节点没有子节点。并在组合中定义图元对 象的行为。
七、组合模式的效果: 3) 使得更容易增加新类型的组件,新定义的
Composite或Leaf子类自动地与已有的结构和客户代 码一起工作,客户程序不需因新的子类而改变。
4) 很难限制组合中的组件。有时你希望一个组 合只能有某些特定的组件。使用Composite时,你 不能依赖类型系统施加这些约束,而必须在运行时 刻进行检查。
this.storeName = storeName; }
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例:
//刷卡消费
public override void PayByCard()
{
Console.WriteLine("店面{0}的积分已累加进该会员卡", storeName);
HPM&S
组合模式(COMPOSITE)
三、组合模式的动机:
HPM&S
组合模式(COMPOSITE)
四、组合模式的适用性: 以下情况下适用Composite模式: 1).你想表示对象的部分-整体层次结构 2).你希望用户忽略组合对象与单个对象的不同, 用户将统一地使用组合结构中的所有对象。
HPM&S
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例: 根据会员卡的消费,来模拟组合模式的实现。首先: 1.我们的部件有,总店,分店,加盟店 2.我们的 部件共有的行为是:刷会员卡 3.部件之间的层次 关系是,总店下有分店、分店下可以拥有加盟店。
HPM&S
组合模式(COMPOSITE)
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例:
//添加店面 public abstract void Add(Storefront store); //删除店面 public abstract void Remove(Storefront store);
//定义所有部件公用的行为 刷卡行为 public abstract void PayByCard(); }
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例: //组合部件类
public class StoreOrBranch : Storefront { //构造函数 public StoreOrBranch() { } public StoreOrBranch(string storeName) { this.storeName = storeName; }
八、组合模式的实现: 3) 最大化Component接口 Composite模式的目的
之一是使得用户不知道他们正在使用的具体的Leaf 和Composite类。为了达到这一目的, Component类 应为Leaf 和Composite类尽可能多定义一些公共操 作。 Component类通常为这些操作提供缺省的实现 而 Leaf 和Composite子类可以对它们进行重定义。
HPM&S
组合模式(COMPOSITE)
一、组合模式要解决的问题: 我们可以把一些简单对象定义成类,然后定义一些 容器类来存储这些简单对象。客户端代码必须区别 简单对象和容器对象,而实际上大多数情况下用户 认为它们是一样的。对这些对象区别使用,使得程 序更加复杂。递归使用的时候更麻烦,问题是我们 如何让用户不必对这些对象进行区别。
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)
九、组合模式的代码示例: //叶子节点
public class JoinInStore : Storefront {
//构造函数 public JoinInStore() { } public JoinInStore(string storeName) {
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 4)声明管理子部件的操作 虽然Composite类实
现了Add 和Remove操作用于管理子部件,但在 Composite模式中一个重要的问题是:在 Composite 类层次结构中哪一些类声明这些操作。这需要在安 全性和透明性之间做出权衡选择。
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例:
List<Storefront> myStoreList = new List<Storefront>(); //刷卡消费 public override void PayByCard() { Console.WriteLine("店面{0}的积分已累加进该会员卡",
设计模式概述
HPM&S
设计模式的思想
设计模式就是综合运用面向对象技术和特性来提高 业务逻辑可复用性的常用方法和经验的提取wk.baidu.com汇总, 是对在一定环境下反复出现问题的解决方案。
▪ 设计模式的优点
使人们更加简单方便地复用成功的设计和体系结构, 更容易理解成功者的设计思路,帮助开发者做出有利 于系统复用的选择,通过提供类和对象作用关系以及 它们之间潜在联系的说明规范,帮助设计者更快更好 地完成系统设计。
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 5) Component是否应该实现一个 Component列表
你可能希望在Component类中将子节点集合定义为 一个实例变量,而这个 Component类中也声明了一 些操作对子节点进行访问和管理。但是在基类中存 放子类指针,对叶节点来说会导致空间浪费,因为 叶节点根本没有子节点。只有当该结构中子类数目 相对较少时,才值得使用这种方法。
HPM&S
组合模式(COMPOSITE)
二、组合模式的意图: 将对象组合成树形结构,以表示“整体和部分”的 层次结构。组合模式使得用户对单个对象和组合对 象的使用具有一致性。它使我们在树型结构的问题 中,模糊了简单元素和复杂元素的概念,客户程序 可以像处理简单元素一样来处理复杂元素,从而使 得客户程序与复杂元素的内部结构解耦。
HPM&S
组合模式(COMPOSITE)
三、组合模式的动机: 然而这种方法存在一个问题:使用这些类的代码必 须区别对待图元对象与容器对象,而实际上大多数 情况下用户认为它们是一样的。对这些类区别使用, 使得程序更加复杂。组合模式描述了如何使用递归 组合,使得用户不必对这些类进行区别,如下图所 示。
制的语言中,当一个Composite被销毁时,通常最 好由Composite 负责删除其子节点。但有一种情况 除外,即 Leaf对象不会改变,因此可以被共享。
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 9)存贮组件最好用哪一种数据结构 Composite
可使用多种数据结构存贮它们的子节点,包括连接 列表、树、数组和 h a s h表。数据结构的选择取决 于效率。有时对每个子节点, Composite都有一个 变量与之对应,这就要求 Composite的每个子类都 要实现自己的管理接口。
七、组合模式的效果: 1) 基本对象可以被组合成更复杂的组合对象,
而这个组合对象又可以被组合,这样不断的递归下 去。客户代码中,任何用到基本对象的地方都可以 使用组合对象。
2) 简化客户代码,客户可以一致地使用组合结 构和单个对象。在定义组合结构的那些类中不需要 写一些充斥着选择语句的函数。
HPM&S
HPM&S
组合模式(COMPOSITE)
六、组合模式的参与者: 树枝构件角色(Composite):定义有子部件的
那些部件的行为。存储子部件。在Composite接口 中实现与子部件有关的操作。
客户角色(Client):通过component接口操纵 组合部件的对象。
HPM&S
组合模式(COMPOSITE)
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 6) 子部件排序 许多设计指定了Composite的子
部件顺序。在前面的 Graphics例子中,排序可能表 示了从前至后的顺序。如果需要考虑子节点的顺序 时,必须仔细地设计对子节点的访问和管理接口, 以便管理子节点序列。
HPM&S
组合模式(COMPOSITE)
九、组合模式的代码示例: //抽象的部件类描述将来所有部件共有的行为
public abstract class Storefront { //店名 protected string storeName = string.Empty; public string StoreName { get { return storeName;
八、组合模式的实现: 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
HPM&S
结构型设计模式简介
结构型模式——结构型设计模式是从程序结构上解决 模块之间的耦合问题。结构型模式涉及到如何组合类 和对象以获得更大的结构。结构型类模式采用继承机 制来组合接口或实现。结构型对象模式不是对接口和 实现进行组合,而是描述了如何对一些对象进行组合, 从而实现新功能的方法。因为可以在运行时刻改变对 象组合关系,所以对象组合方式具有更大的灵活性, 而这种机制用静态类组合是不可能实现的。
}
}
HPM&S
组合模式(COMPOSITE)
HPM&S
组合模式(COMPOSITE)
三、组合模式的动机: 在绘图编辑器和图形捕捉系统这样的图形应用程序 中,用户可以使用简单的组件创建复杂的图表。用 户可以组合多个简单组件以形成一些较大的组件, 这些组件又可以组合成更大的组件。一个简单的实 现方法是为 Te x t和L i n e这样的图元定义一些类, 另外定义一些类作为这些图元的容器类( C o n t a i n e r )。
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 2 ) 共享组件 共享组件是很有用的,比如可以
减少对存贮的需求。但是当一个组件只有一个父部 件时,很难共享组件。一个可行的解决办法是为子 部件存贮多个父部件,但当一个请求在结构中向上 传递时,这种方法会导致多义性。
HPM&S
组合模式(COMPOSITE)
HPM&S
组合模式(COMPOSITE)
八、组合模式的实现: 1 )显式的父部件引用。保持从子部件到父部件
的引用能简化组合结构的遍历和管理。父部件引用 可以简化结构的上移和组件的删除。通常在 Component类中定义父部件引用。 L e a f和 Composite类可以继承这个引用以及管理这个引用 的那些操作。
组合模式(COMPOSITE)
五、组合模式的结构:
HPM&S
组合模式(COMPOSITE)
六、组合模式的参与者: 抽象构件角色(component):是组合中的对
象声明接口,在适当的情况下,实现所有类共有接 口的默认行为。声明一个接口用于访问和管理 Component子部件。
树叶构件角色(Leaf):在组合树中表示叶节点 对象,叶节点没有子节点。并在组合中定义图元对 象的行为。