第六章 装饰模式.ppt

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章 装饰模式 一 、 概述 具体组件类的实例称作“被装饰者”,具体装饰类的实例称为“装饰者” 具体装饰类需要包含具体组件类的一个实例的引用,以便装饰被装饰者。 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的型。 如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。 二、装饰模式模式的结构与使用 结构的描述 “具体组件”和“装饰”都是“抽象组件”的子类 使用抽象组件声明的对象既可以存放被装饰者的引用,也可以存放装饰者的引用 可以把装饰者作为一个被装饰者,意味着可以使用具体装饰类来装饰具体装饰类的实例 举例说明如何使用装饰模式 举例: 假设系统中有一个Bird抽象类以及Bird类的一个子类Sparrow。 Sparrow类实现了Bird类的fly方法,使得Sparrow类创建的对象(麻雀)调用fly方法能连续飞行100米。 现在用户需要两只鸟,无论是哪种鸟都可以,但必须能连续飞行150米和200米。 现有系统无法向用户提供这样的Bird对象,所有需要修改现有系统 如果使用装饰模式,不必修改系统代码,只需在系统中添加“装饰”,该系统就可以创建出用户需要的鸟 设计的类图 运行结果 三、使用多个装饰者 Decorator是Component的一个子类,因而“装饰者”本身也可以作为一个“被装饰者”。这意味着可以使用多个具体装饰类来装饰具体组件的实例 例如:用户需要能飞行120米、170米、220米的鸟,可以不修改现有类,只需再添加一个具体装饰即可。 如果用户需要能飞行120米、170米、220米和240米的鸟,用户程序只需使用如下代码: Bird bird1= new SparrowDecoratorTwo(new Sparrow()); Bird bird2= new SparrowDecorator (bird1); Bird bird3= new SparrowDecorator (bird2); Bird bird4= new SparrowDecoratorTwo (bird3); 四、装饰模式相对继承机制的优势 通过继承也可改进对象的行为 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。 继承机制难以应对用户需求的变化,带来维护的灾难。 如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。 -----多用组合,少用继承原则。 五、装饰模式的优点 六、适合使用装饰模式的情景 程序希望动态地增强类的某个对象的功能,而又不影响到该类的其他对象。 采用继承来增强对象功能不利于系统的扩展和维护。 在什么情况下应当使用装饰模式? 使用装饰模式的优点有哪些? 简述装饰模式相对于继承机制的优势。 张明敏的《我的中国心》歌曲里面唱:“洋装虽然穿在身,我的心依然是中国心… …”。请问该歌词里蕴含的是否为装饰模式,为什么? * 装饰模式(别名:包装器) 动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。 Decorator Pattern(Another Name: Wrapper) Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. 装饰模式是动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。 例如:能飞150米的麻雀(装上智能电子翅膀) 在装饰模式中,“具体组件”类和“具体装饰”类是该模式中的最重要的两个角色。 装饰模式的结构中包括四种角色: 抽象组件(Component):一个抽象类 具体组件(ConcreteComponent):抽象组件的子类 装饰(Decorator):也是抽象组件的子类,还包含一个抽象组件声明的变量,以保存“被装饰者的引用” 具体装饰(ConcreteDecotator):装饰的一个非抽象子类。 装饰模式的UML类图 1.抽象组件 : Bird.java public abstract class Bird{ public abstract int fly( ); } 规定了具体组件需要实现的方法fly( ) 2.具体组件 : Sparrow.java public class Sparrow extends Bird{ public final int DISTANCE=100;

文档评论(0)

35425 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档