java设计模式课件chap06.ppt_第1页
java设计模式课件chap06.ppt_第2页
java设计模式课件chap06.ppt_第3页
java设计模式课件chap06.ppt_第4页
java设计模式课件chap06.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java设计模式 2020 2 4 1 软件学院宋波 第6章装饰模式 2020 2 4 2 装饰模式 别名 包装器 动态地给对象添加一些额外的职责 就功能来说装饰模式相比生成子类更为灵活 DecoratorPattern AnotherName Wrapper Attachadditionalresponsibilitiestoanobjectdynamically Decoratorsprovideaflexiblealternativetosubclassingforextendingfunctionality 6 1概述 2020 2 4 3 解读 装饰模式是动态地扩展一个对象的功能 而不需要改变原始类代码的一种成熟模式 在装饰模式中 具体组件 类和 具体装饰 类是该模式中的最重要的两个角色 6 1概述 2020 2 4 4 具体组件类的实例称作 被装饰者 具体装饰类的实例称为 装饰者 具体装饰类需要包含有 具体组件 类的一个实例的引用 以便装饰 被装饰者 麻雀类 具体组件类 的实例 被装饰者 调用fly 麻雀类的fly方法能飞100米 具体装饰类的实例 装饰者 调用fly 麻雀类 具体组件类 的fly方法能飞100米 装饰类的elefly方法能飞50米 具体装饰类的fly方法能飞150米 6 2装饰模式的结构与使用 2020 2 4 7 装饰模式的结构中包括四种角色 抽象组件 Component 定义了被装饰者需要进行 装饰 的方法 具体组件 ConcreteComponent 是抽象组件的一个子类 具体组件的实例称作 被装饰者 装饰 Decorator 是抽象组件的一个子类 它包含一个抽象组件声明的变量以保存被装饰者的引用 具体装饰 ConcreteDecotator 是装饰类的一个非抽象子类 它的实例称作 装饰者 2020 2 4 8 6 2 1装饰模式的UML类图 麻雀的实例 具体装饰类的实例 装饰者 调用fly 麻雀类 具体组件类 的fly方法能飞100米 装饰类的elefly方法能飞50米 具体装饰类的fly方法能飞150米 装饰模式 分析 2020 2 4 11 具体组件和装饰类都是抽象组件的子类 抽象组件声明的对象 即可以存放被装饰者的引用 也可以存放装饰者的引用 对用户而言 装饰者所实现的抽象组件中的方法是 被装饰者 相应方法的改进或修正 2020 2 4 12 6 2 2装饰模式的结构的描述与使用 假设系统中有一个Bird抽象类以及Bird类的一个子类Sparrow Sparrow类实现了Bird类的fly方法 使得Sparrow类创建的对象 麻雀 调用fly方法能连续飞行100米 现在 用户需要2只鸟 无论是哪一只 必须分别能连续飞行150米和200米 2020 2 4 14 6 2 2装饰模式的结构的描述与使用 1 抽象组件 Bird java 规定了具体组件要实现的方法publicabstractclassBird publicabstractintfly 2020 2 4 15 2 具体组件 Sparrow java 实现fly方法时 返回值为100米publicclassSparrowextendsBird publicfinalintDISTANCE 100 publicintfly returnDISTANCE 16 3 装饰 Decorator Decorator java 包含有一个Bird声明的变量 保存被装饰者的应用publicabstractclassDecoratorextendsBird protectedBirdbird publicDecorator publicDecorator Birdbird this bird bird 17 4 具体装饰 ConcreteDecotator SparrowDecorator java publicclassSparrowDecoratorextendsDecorator publicfinalintDISTANCE 50 eleFly方法能飞50米SparrowDecorator Birdbird super bird publicintfly intdistance 0 distance bird fly eleFly returndistance privateinteleFly 装饰者新添加的方法returnDISTANCE 2020 2 4 18 5 应用Application java publicclassApplication publicstaticvoidmain Stringargs Applicationclient newApplication Birdsparrow newSparrow sparrow只能飞100米 sprrowDecorator1能飞150米BirdsparrowDecorator1 newSparrowDecorator sparrow sprrowDecorator2能飞200米BirdsparrowDecorator2 newSparrowDecorator sparrowDecorator1 client needBird sparrowDecorator1 client needBird sparrowDecorator2 2020 2 4 19 5 应用Application java publicvoidneedBird Birdbird intflyDistance bird fly System out println 这只鸟能飞行 flyDistance 米 sparrowDecorator1对象 调用fly 委托sparrow调用fly方法能飞100米 引用装饰类的elefly方法能飞50米 sparrowDecorator2对象 调用fly 委托sparrowDecorator1调用fly方法能飞150米 引用装饰类的elefly方法能飞200米 2020 2 4 22 Application class 1 2 3 4 Sparrow class 1 6 语义 创建具体组件 被装饰者 飞行100米 UML语义 继承 关系 案例分析 2020 2 4 23 Application class 1 2 3 4 5 语义 创建装饰类的实例 装饰者 飞行150米 UML语义 继承 和 关联 关系SparrowDecorator class 3 5 Decorator class 5 7 Bird class Sparrow class 案例分析 2020 2 4 25 6 3使用多个装饰者 由于装饰类是抽象组件的一个子类 因此装饰者本身也可以作为一个被装饰者 这就意味着可以使用多个具体装饰类来装饰具体组件的实例 2020 2 4 26 6 3使用多个装饰者 实例 假如用户不仅需要能飞行150 200米的鸟 也需要能飞行120米 170米 220米的鸟 此时 不必修改现有的类 只需再添加一个具体装饰类即可 27 publicclassSparrowDecoratorTwoextendsDecorator publicfinalintDISTANCE 20 SparrowDecoratorTwo Birdbird super bird publicintfly intdistance 0 distance bird fly eleFly returndistance publicinteleFly returnDISTANCE Birdbird1 newSparrowDecoratorTwo newSparrow Birdbird2 newSparrowDecorator bird1 Birdbird3 newSparrowDecorator bird2 2020 2 4 29 6 4装饰模式与继承机制 面向对象的基本原则之一 少用继承 多用组合 假设用继承机制实现设计 就需要在系统中再添加两个Bird抽象类的子类 Lark能飞行150米 Swallow能飞行200米 2020 2 4 31 6 4装饰模式与继承机制 假设用户需求发生变化 现在用户又需要一只能飞250米的鸟 而且过一段时间可能又需要能飞行300米的鸟 如果采用继承机制 就必须修改系统 增加新的子类 这对系统维护是一场灾难 6 5装饰模式的优点 2020 2 4 32 被装饰者和装饰者是松耦合关系 由于装饰类仅仅依赖于抽象组件 因此具体

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论