设计模式——09组合模式与装饰模式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

组合模式(续)
实例分析 实例一:水果盘(代码实现)
组合模式(续)
实例分析 实例二:文件的遍历
组合模式(续)
Client AbstractElement
+ display () : void
实例分析 实例二:文件的遍历
TextFile
- filename : String + display () : void + TextFile (String filename)
ComplexPhone
+ ComplexPhone (Cellphone phone) + receiveCall () : void
装饰模式(续)
实例分析 实例二:手机功能的升级(代码实现)
装饰模式(续)
模式优缺点 使用装饰模式主要有以下的优点:
装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可
组合模式(续)
参与者 Component:抽象构件(接口或抽象类)
Leaf:叶子构件
Composite:容器构件 Client:客户类
组合模式(续)
实例分析 实例一:水果盘
组合模式(续)
实例分析 实例一:水果盘
Client MyElement
+ eat () : void
Bird
+ Bird (Dasheng sun) + fly () : void
装饰模式(续)
实例分析 实例一:孙悟空七十二变(代码实现)
装饰模式(续)
实例分析 实例二:手机功能的升级
Cellphone
+ receiveCall () : void
SimplePhone
+ receiveCall () : void
+ operation () + addedBehavior ()
super.operation(); addedBehavior();
装饰模式(续)
参与者 Component:组件
ConcreteComponent:具体组件
Decorator:抽象装饰类 ConcreteDecorator:具体装饰类
+ operation ()
ConcreteComponent
+ operation ()
Decorator
+ operation () component component.operation();
ConcreteDecoratorA
- addedState : + operation ()
ConcreteDecoratorB
Apple
+ eat () : void
Banana
+ eat () : void
Pear
+ eat () : void
Plate
- v : Vector + add (MyElement element) : void + delete (MyElement element) : void + eat () : void
的容器对象,而这个容器对象又可以被组合,这样不断地递归下去。客户代码 中,任何用到叶子对象的地方都可以使用容器对象。
更容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改
代码。
组合模式(续)
模式优缺点 组合模式的缺陷是使得设计变得更加抽象,对象的商业规则如果很复
杂,则实现组合模式具有很大挑战性,并且,不是所有的方法都与叶
对象(即容器对象)的使用具有一致性。组合模式又可以称为“整体 —部分”(Part-Whole)模式,属于对象的结构模式,它将对象组织到树 结构中,可以用来描述整体与部分的关系。
组合模式(续)
模式结构
Client
+ + + +
Component
operation () add (Component c) remove (Component c) getChild (int i)
PhoneDecorator
- phone : Cellphone + PhoneDecorator (Cellphone phone) receiveCall + receiveCall () : void phone
JarPhone
+ JarPhone (Cellphone phone) + receiveCall () : void
装饰模式(续)
模式定义 装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责
(Responsibility),就增加对象功能来说,装饰模式比生成子类实现
更为灵活。其别名为包装器(Wrapper)。装饰模式是一种对象结构型模 式。
装饰模式(续)
模式结构
Component
责。
需要动态地给一个对象增加功能,这些功能可以再动态地被撤销。 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独
立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆
炸性增长。另一种情况可能是因为类定义不能继承(final类),或类定义
不能用于生成子类。
装饰模式(续)
模式应用 Java I/O中的装饰模式
组合模式(续)
实例分析 实例二:文件的遍历(代码实现)
组合模式(续)
模式优缺点 组合模式主要优点如下 :
使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就
不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
定义了包含叶子对象和容器对象的类层次结构,叶子对象可以被组合成更复杂
组合模式(续)
模式深入 安全的组合模式


组合模式中有哪些参与者,简述其职责。 在模式的定义图中,如果聚合的关系不是从Composite到Component
的,而是从Composite到Leaf的,会怎么样呢?
装饰模式
模式动机
有时我们希望给某个对象而不是整个类添加一些功能。例如:一个图形用户界
ImageFile
- filename : String + display () : void + ImageFile (String filename)
Folder
- list : ArrayList - filename : String + add (AbstractElement element) : void + delete (AbstractElement element) : void + display () : void + Folder (String filename)
模式使用 在以下情况下适合使用组合模式:
需要表示一个对象整体或部分层次。
想让客户能够忽略不同对象层次的变化。 对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它
们。
组合模式(续)
模式应用
组合模式(续)
模式深入 组合模式的扩展
组合模式(续)
模式深入 透明的组合模式
Leaf
+ operation () + + + +
Composite
operation () add (Component c) remove (Component c) getChild (int i) children
for(Component child:children) child.operation();
些对象仅仅在他们相互连接的方式上有所不同,而不是它们的类或是 它们的属性值有所不同。尽管对于那些了解这些系统的人来说,很容 易对它们进行定制,但是很难学习这些系统,排错也很困难。
装饰模式(续)
模式使用 在以下情况下适合使用装饰模式:
在不影响其它对象的情况下,以动态、透明的方式给单对象添加职
面工具箱允许我们对任意一个用户界面组件添加一些新的特性,如增加一个边 框;或者增加一些行为,如窗口的滚动。
一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象来添加边框。我
们称这个嵌入的对象为装饰器(Decorator)。这个装饰与它所装饰的组件接口 一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且可 能在转发前后执行一些额外的动作。这种透明性使得我们可以递归嵌套多个装 饰,从而可以添加任意多的功能。
组合模式 与 装饰模式
Sunny Liu weiliu_china@


组合模式 装饰模式
组合模式
模式动机
组合模式(续)
模式定义 组合模式 (Composite Pattern):组合多个对象形成树形结构以表示“整
体—部分”的结构层次。组合模式对单个对象(即叶子对象)和组合
装饰模式(续)
实例分析 实例一:孙悟空七十二变
Dasheng
+ climb () : void
Monkey
+ Monkey () + climb () : void
Changer
+ Changer (Dasheng sun) + climb () : void sun
Fish
+ Fish (Dasheng sun) + swim () : void
以提供比继承更多的灵活性。
通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以
创造出很多不同行为的组合。
这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加
易于出错。
装饰模式(续)
模式优缺点 其缺点如下:
采用装饰模式进行系统设计往往会产生许多看上去类似的小对象,这
装饰模式(续)
模式深入 透明的装饰模式
半透明的装饰模式


装饰模式中有哪些参与者,简述其职责。 修改实例一“孙悟空七十二变”代码, 使得孙悟空可以同时拥有
climb(),swim()和fly()三个方法,即修改半透明的装饰模式为透明的
装饰模式(提示:可以增加一个新的方法)。
子构件子类都有关联;还有一点就是要使得容易增加新组件会产生一 些问题,那就是很难对容器中的组件进行限制。有时候我们希望一个 容器中只能有某些特定的构件。使用组合模式时,不能依赖类型系统 来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下, 必须通过在运行时进行类型检查来实现。
组合模式(续)
相关文档
最新文档