当前位置:文档之家› 设计模式——09组合模式与装饰模式精品PPT课件

设计模式——09组合模式与装饰模式精品PPT课件


+ add (MyElement element) : void
+ delete (MyElement element) : void
+ eat ()
: void
组合模式(续)
实例分析 实例一:水果盘(代码实现)
组合模式(续)
实例分析 实例二:文件的遍历
组合模式(续)
实例分析
Client
: void
+ TextFile (String filename)
Folder
- list
: ArrayList
- filename : String
+ add (AbstractElement element) : void
+ delete (AbstractElement element) : void
组合模式 与
装饰模式
Sunny Liu
组合模式 装饰模式
内容
模式动机
组合模式
组合模式(续)
模式定义 组合模式 (Composite Pattern):组合多个对象形成树形结构以表示“整
体—部分”的结构层次。组合模式对单个对象(即叶子对象)和组合 对象(即容器对象)的使用具有一致性。组合模式又可以称为“整体 —部分”(Part-Whole)模式,属于对象的结构模式,它将对象组织到树 结构中,可以用来描述整体与部分的关系。
组合模式(续)
实例分析 实例一:水果盘
组合模式(续)
实例分析 实例一:水果盘
Client
MyElement
+ eat () : void
Apple
+ eat () : void
Banana
+ eat () : void
Pear
+ eat () : void
Plate
- v : Vector
组合模式(续)
模式使用 在以下情况下适合使用组合模式: 需要表示一个对象整体或部分层次。 想让客户能够忽略不同对象层次的变化。 对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它
们。
模式应用
组合模式(续)
组合模式(续)
模式深入 组合模式的扩展
组合模式(续)
模式深入 透明的组合模式
组合模式(续)
模式深入 安全的组合模式
练习
组合模式中有哪些参与者,简述其职责。 在模式的定义图中,如果聚合的关系不是从Composite到Component
的,而是从Composite到Leaf的,会怎么样呢?
装饰模式
模式动机
有时我们希望给某个对象而不是整个类添加一些功能。例如:一个图形用户界 面工具箱允许我们对任意一个用户界面组件添加一些新的特性,如增加一个边 框;或者增加一些行为,如窗口的滚动。
一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象来添加边框。我 们称这个嵌入的对象为装饰器(Decorator)。这个装饰与它所装饰的组件接口 一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且可 能在转发前后执行一些额外的动作。这种透明性使得我们可以递归嵌套多个装 饰,从而可以添加任意多的功能。
装饰模式(续)
模式定义 装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责
(Responsibility),就增加对象功能来说,装饰模式比生成子类实现 更为灵活。其别名为包装器(Wrapper)。装饰模式是一种对象结构型模 式。
装饰模式(续)
模式结构
Component
+ operation ()
ConcreteComponent
+ operation ()
Decorator
+ operation ()
component component.operation();
ConcreteDecoratorA
- addedState : + operation ()
+ display ()
: void
+ Folder (String filename)
组合模式(续)
实例分析 实例二:文件的遍历(代码实现)
组合模式(续)
模式优缺点 组合模式主要优点如下 :
使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就 不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
定义了包含叶子对象和容器对象的类层次结构,叶子对象可以被组合成更复杂 的容器对象,而这个容器对象又可以被组合,这样不断地递归下去。客户代码 中,任何用到叶子对象的地方都可以使用容器对象。
更容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改 代码。
组合模式(续)
模式优缺点 组合模式的缺陷是使得设计变得更加抽象,对象的商业规则如果很复
组合模式(续)
模式结构
Client
Component
+ operation () + add (Component c) + remove (Component c) + getChild (int i)
Leaf
+ operation ()
for(Component child:children) child.operation();
杂,则实现组合模式具有很大挑战性,并且,不是所有的方法都与叶 子构件子类都有关联;还有一点就是要使得容易增加新组件会产生一 些问题,那就是很难对容器中的组件进行限制。有时候我们希望一个 容器中只能有某些特定的构件。使用组合模式时,不能依赖类型系统 来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下, 必须通过在运行时进行类型检查来实现。
Composite
+ operation () + add (Component c) + remove (Component c) + getChild (int i)
children
组合模式(续)
参与者 Component:抽象构件(接口或抽象类) Leaf:叶子构件 Composite:容器构件 Client:客户类
实例二:文件的遍历
AbstractElement
+ display () : void
ImageFile
- filename : String
+ display ()
: void
+ ImageFile (String filename)
TextFileLeabharlann - filename : String
+ display ()
相关主题