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

下载本文档

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

文档简介

设计模式概述 2 主要内容 设计模式的诞生与发展设计模式的定义与分类GoF设计模式简介设计模式的优点 3 设计模式的诞生与发展 模式的诞生与定义模式起源于建筑业而非软件业模式 Pattern 之父 美国加利佛尼亚大学环境结构中心研究所所长ChristopherAlexander博士 APatternLanguage Towns Buildings Construction 253个建筑和城市规划模式模式Context 模式可适用的前提条件 Theme或Problem 在特定条件下要解决的目标问题 Solution 对目标问题求解过程中各种物理关系的记述 4 设计模式的诞生与发展 ChristopherAlexander 5 设计模式的诞生与发展 模式的诞生与定义Alexander给出了关于模式的经典定义 每个模式都描述了一个在我们的环境中不断出现的问题 然后描述了该问题的解决方案的核心 通过这种方式 我们可以无数次地重用那些已有的解决方案 无需再重复相同的工作 Apatternisasolutiontoaprobleminacontext模式是在特定环境中解决问题的一种方案 6 设计模式的诞生与发展 软件模式1990年 软件工程界开始关注ChristopherAlexander等在这一住宅 公共建筑与城市规划领域的重大突破 最早将该模式的思想引入软件工程方法学的是1991 1992年以 四人组 GangofFour GoF 分别是ErichGamma RichardHelm RalphJohnson和JohnVlissides 自称的四位著名软件工程学者 他们在1994年归纳发表了23种在软件开发中使用频率较高的设计模式 旨在用模式来统一沟通面向对象方法在分析 设计和实现间的鸿沟 7 设计模式的诞生与发展 GangofFour 8 设计模式的诞生与发展 ErichGamma 苏黎世大学计算机科学博士 是Eclipse JUnit等项目主要技术负责人之一 JohnVlissides 斯坦福大学计算机科学博士 原IBM研究员 于2005年11月24日因脑瘤去世 享年44岁 RalphJohnson 墨尔本大学计算机科学博士 原IBM研究员 现在波士顿顾问集团供职 RichardHelm 康奈尔大学计算机科学博士 伊利诺伊大学教授 GangofFour 9 设计模式的诞生与发展 软件模式软件模式是将模式的一般概念应用于软件开发领域 即软件开发的总体指导思路或参照样板 软件模式并非仅限于设计模式 还包括架构模式 分析模式和过程模式等 实际上 在软件生存期的每一个阶段都存在着一些被认同的模式 软件模式可以认为是对软件开发这一特定 问题 的 解法 的某种统一表示 它和Alexander所描述的模式定义完全相同 即软件模式等于一定条件下的出现的问题以及解法 软件模式的基础结构由4个部分构成 问题描述 前提条件 环境或约束条件 解法和效果 10 设计模式的诞生与发展 软件模式 11 设计模式的诞生与发展 软件模式软件模式与具体的应用领域无关 在模式发现过程中需要遵循大三律 RuleofThree 即只有经过三个以上不同类型 或不同领域 的系统的校验 一个解决方案才能从候选模式升格为模式 12 设计模式的诞生与发展 设计模式的发展1987年 KentBeck和WardCunningham借鉴Alexander的模式思想在程序开发中开始应用一些模式 在OOPSLA会议上发表了他们的成果 1990年 OOPSLA与ECOOP联合举办 ErichGamma和RichardHelm等人开始讨论有关模式的话题 BruceAnderson主持 四人组 正式成立 并开始着手进行设计模式的分类整理工作 1991年 OOPSLA BruceAnderson主持了首次针对设计模式的研讨会 1992年 OOPSLA Anderson再度主持研讨会 模式已经逐渐成为人们讨论的话题 注 OOPSLA Object OrientedProgramming Systems Languages Applications 面向对象编程 系统 语言和应用大会 编程语言及软件工程国际顶级会议 13 设计模式的诞生与发展 设计模式的发展1993年 KentBeck和GradyBooch赞助了第一次关于设计模式的会议 这个设计模式研究组织发展成为著名的HillsideGroup研究组 1994年 由HillsideGroup发起 在美国伊利诺伊州 Illinois 的AllertonPark召开了第1届关于面向对象模式的世界性会议 名为PLoP PatternLanguagesofPrograms 编程语言模式会议 简称PLoP 94 1995年 PLoP 95仍在伊利诺伊州的AllertonPark举行 四人组 出版了 设计模式 可复用面向对象软件的基础 DesignPatterns ElementsofReusableObject OrientedSoftware 一书 本书成为1995年最抢手的面向对象书籍 也成为设计模式的经典书籍 14 设计模式的诞生与发展 设计模式的发展从1995年至今 设计模式在软件开发中得以广泛应用 在Sun的JavaSE JavaEE平台和Microsoft的 net平台设计中就应用了大量的设计模式 诞生了越来越多的与设计模式相关的书籍和网站 设计模式也作为一门独立的课程或作为软件体系结构等课程的重要组成部分出现在国内外研究生和大学教育的课堂上 15 设计模式的定义与分类 设计模式的定义设计模式 DesignPattern 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 使用设计模式是为了可重用代码 让代码更容易被他人理解 保证代码可靠性 16 设计模式的定义与分类 设计模式的基本要素设计模式一般有如下几个基本要素 模式名称 问题 目的 解决方案 效果 实例代码和相关设计模式 其中的关键元素包括以下四个方面 模式名称 Patternname 问题 Problem 解决方案 Solution 效果 Consequences 17 设计模式的定义与分类 设计模式学习步骤模式动机与定义模式结构与分析模式实例与解析模式效果与应用模式扩展 18 设计模式的定义与分类 设计模式的分类根据其目的 模式是用来做什么的 可分为创建型 Creational 结构型 Structural 和行为型 Behavioral 三种 创建型模式主要用于创建对象 结构型模式主要用于处理类或对象的组合 行为型模式主要用于描述对类或对象怎样交互和怎样分配职责 19 设计模式的定义与分类 设计模式的分类根据范围 即模式主要是用于处理类之间关系还是处理对象之间的关系 可分为类模式和对象模式两种 类模式处理类和子类之间的关系 这些关系通过继承建立 在编译时刻就被确定下来 是属于静态的 对象模式处理对象间的关系 这些关系在运行时刻变化 更具动态性 20 GoF设计模式简介 21 GoF设计模式简介 创建型模式抽象工厂模式 AbstractFactory 建造者模式 Builder 工厂方法模式 FactoryMethod 原型模式 Prototype 单例模式 Singleton 22 GoF设计模式简介 结构型模式适配器模式 Adapter 桥接模式 Bridge 组合模式 Composite 装饰模式 Decorator 外观模式 Facade 享元模式 Flyweight 代理模式 Proxy 23 GoF设计模式简介 行为型模式职责链模式 ChainofResponsibility 命令模式 Command 解释器模式 Interpreter 迭代器模式 Iterator 中介者模式 Mediator 备忘录模式 Memento 观察者模式 Observer 状态模式 State 策略模式 Strategy 模板方法模式 TemplateMethod 访问者模式 Visitor 24 设计模式的优点 设计模式是从许多优秀的软件系统中总结出的成功的 能够实现可维护性复用的设计方案 使用这些方案将避免我们做一些重复性的工作 而且可以设计出高质量的软件系统 设计模式的主要优点如下 设计模式融合了众多专家的经验 并以一种标准的形式供广大开发人员所用 它提供了一套通用的设计词汇和一种通用的语言以方便开发人员之间沟通和交流 使得设计方案更加通俗易懂 对于使用不同编程语言的开发和设计人员可以通过设计模式来交流系统设计方案 每一个模式都对应一个标准的解决方案 设计模式可以降低开发人员理解系统的复杂度 25 设计模式的优点 设计模式使人们可以更加简单方便地复用成功的设计和体系结构 将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路 设计模式使得重用成功的设计更加容易 并避免那些导致不可重用的设计方案 设计模式使得设计方案更加灵活 且易于修改 设计模式的使用将提高软件系统的开发效率和软件质量 且在一定程度上节约设计成本 设计模式有助于初学者更深入地理解面向对象思想 一方面可以帮助初学者更加方便地阅读和学习现有类库与其他系统中的源代码 另一方面还可以提高软件的设计水平和代码质量 26 SimpleFactory模式 又称StaticFactory模式 客户类和工厂类分开 消费者任何时候需要某种产品 只需向工厂请求即可 消费者无须修改就可以接纳新产品 缺点是当产品修改时 工厂类也要做相应的修改 27 SimpleFactory模式 又称StaticFactory模式 假设有一个八音盒工厂 购买八音盒的客人不用知道八音盒是如何制作的 他只要知道如何播放八音盒就可以了 以UML类别图来表示以上的概念 28 例子 publicinterfaceIMusicBox publicvoidplay publicclassPianoBoximplementsIMusicBox publicvoidplay System out println 拨放钢琴音乐 publicclassViolinBoximplementsIMusicBox publicvoidplay System out println 拨放小提琴音乐 29 例子 publicclassMusicBoxFactory publicstaticIMusicBoxcreateMusicBox Stringname throwsInstantiationException IllegalAccessException ClassNotFoundException 这边使用的是Java的Reflection机制来产生实例 不过客户端不用管啦 以后就算改变了程序 客户端程序是不用更改的return IMusicBox Class forName name newInstance 30 例子 publicclassMusicBoxDemo publicstaticvoidmain String args throwsException playMusicBox MusicBoxFactory createMusicBox PianoBox playMusicBox MusicBoxFactory createMusicBox ViolinBox publicstaticvoidplayMusicBox IMusicBoxmusicBox musicBox play 由于客户端只依赖于IMusicBox接口 所以即使您日后改变了createMusicBox 中的实现方式 对客户端是一点影响也没有的 31 SimpleFactory的类别结构 32 AbstractFactory 抽象工厂模式 意图提供一个创建一系列相关或相互依赖对象的接口 而无需指定它们具体的类 适用性一个系统要独立于它的产品的创建 组合和表示时 一个系统要用多个产品系列中的一个来配置时 要强调一系列相关的产品对象的设计以便进行联合使用时 提供一个产品类库 而只想显示它们的接口而不是实现时 33 AbstractFactory 34 抽象工厂 35 产品族 36 采用抽象工厂模式设计出的系统类图 37 在什么情形下应当使用抽象工厂模式 1 一个系统不应当依赖于产品类实例如何被创建 组合和表达的细节 这对于所有形态的工厂模式都是重要的 2 这个系统的产品有多于一个的产品族 而系统只消费其中某一族的产品 上面这一条叫做抽象工厂模式的原始用意 3 同属于同一个产品族的产品是在一起使用的 这一约束必须要在系统的设计中体现出来 4 系统提供一个产品类的库 所有的产品以同样的接口出现 从而使客户端不依赖于实现 38 类图 39 系统的设计图 40 抽象工厂模式的另一个例子 这个例子描述微型计算机配件的生产 这个系统所需要的产品族有两个 一个系列是PC 或称IBM及IBM克隆机系列 另一个系列是MAC 或称MacIntosh系列 产品等级结构也有两个 一个是RAM 另一个是CPU 41 系统的设计图 42 开 闭 原则 开 闭 原则要求一个软件系统可以在不修改原有代码的情况下 通过扩展达到增强其功能的目的 对于一个涉及到多个产品等级结构和多个产品族的系统 其功能的增强不外乎两个方面 增加新的产品族 增加新的产品等级结构 那么抽象工厂模式是怎样支持这两方面功能增强的呢 43 增加新的产品族 在产品等级结构的数目不变的情况下 增加新的产品族 就意味着在每一个产品等级结构中增加一个 或者多个 新的具体 或者抽象和具体 产品角色 由于工厂等级结构是与产品等级结构平行的登记机构 因此 当产品等级结构有所调整时 需要将工厂等级结构做相应的调整 现在产品等级结构中出现了新的元素 因此 需要向工厂等级结构中加入相应的新元素就可以了 换言之 设计师只需要向系统中加入新的具体工厂类就可以了 没有必要修改已有的工厂角色或者产品角色 44 FactoryMethod 运算 意图定义一个用于创建对象的接口 让子类决定实例化哪一个类 FactoryMethod使一个类的实例化延迟到其子类 45 FactoryMethod 当系统扩展需要添加新的产品对象时 仅仅需要添加一个具体对象以及一个具体工厂对象 原有工厂对象不需要进行任何修改 也不需要修改客户端 很好的符合了 开放 封闭 原则 46 FactoryMethod 例子有一个农庄 每一种作物都有专门的园丁管理 形成了规模化和专业化生产 47 FactoryMethod 水果产品接口Fruit javapackagecom lavasoft patterns factorymethod ybms 工厂模式 工厂方法模式 一般性模式 农场应用 ReadMe 水果接口 publicinterfaceFruit 种植 voidplant 生长 voidgrow 收获 voidharvest 48 具体产品苹果Apple javapackagecom lavasoft patterns factorymethod ybms 工厂模式 工厂方法模式 一般性模式 农场应用 publicclassAppleimplementsFruit privateinttreeAge 种植 publicvoidplant System out println Applehasbeenplanted 生长 publicvoidgrow System out println Appleisgrowing 收获 publicvoidharvest return返回树龄 publicintgetTreeAge returntreeAge publicvoidsetTreeAge inttreeAge this treeAge treeAge 49 FactoryMethod 水果工厂接口 FruitGardener javapackagecom lavasoft patterns factorymethod ybms 工厂模式 工厂方法模式 一般性模式 农场应用 ReadMe 水果工厂接口 publicinterfaceFruitGardener 工厂方法 return水果 publicFruitfactory 50 苹果工厂 AppleGardener javapackagecom lavasoft patterns factorymethod ybms 工厂模式 工厂方法模式 一般性模式 农场应用 ReadMe 苹果工厂方法 publicclassAppleGardenerimplementsFruitGardener 工厂方法 return苹果 publicFruitfactory Fruitf newApple System out println 水果工厂 AppletGardener 成功创建一个水果 苹果 returnf 51 单例 Singleton 模式 单例单例显然单例模式的要点有三个 一是某各类只能有一个实例 二是它必须自行创建这个事例 三是它必须自行向整个系统提供这个实例 在下面的对象图中 有一个 单例对象 而 客户甲 客户乙 和 客户丙 是单例对象的三个客户对象 可以看到 所有的客户对象共享一个单例对象 而且从单例对象到自身的连接线可以看出 单例对象持有对自己的引用 52 资源管理 在计算机系统中 需要管理的资源包括软件外部资源 譬如每台计算机可以有若干个打印机 但只能有一个PrinterSpooler 以避免两个打印作业同时输出到打印机中 每台计算机可以有若干传真卡 但是只应该有一个软件负责管理传真卡 以避免出现两份传真作业同时传到传真卡中的情况 每台计算机可以有若干通信端口 系统应当集中管理这些通信端口 以避免一个通信端口同时被两个请求同时调用 这些资源管理器构件必须只有一个实例 这是其一 它们必须自行初始化 这是其二 允许整个系统访问自己这是其三 因此 它们都满足单例模式的条件 是单例模式的应用 53 单例模式的结构 单例模式有以下的特点 单例类只可有一个实例 单例类必须自己创建自己这惟一的实例 单例类必须给所有其他对象提供这一实例 虽然单例模式中的单例类被限定只能有一个实例 但是单例模式和单例类可以很容易被推广到任意且有限多个实例的情况 这时候称它为多例模式 MultitonPattern 和多例类 54 单例模式的结构 单例类的简略类图如下所示 单例模式在Java语言的实现上有自己的特别 这些特点往往表现在如何将自己实例化上 大致有以下三种 饿汉式单例类懒汉式单例类登记式单例类 55 饿汉式单例类 饿汉式单例类饿汉式单例类是在Java语言里实现得最为简便的单例类 此类自己将自己实例化 56 饿汉式单例类 publicclassEagerSingleton privatestaticfinalEagerSingletonm instance newEagerSingleton privateEagerSingleton publicstaticEagerSingletongetInstance returnm instance 在这个类被加载时 静态变量m instance会被初始化 此时类的私有构造子会被调用 这时候 单例类的惟一实例就被创建出来了 Java语言中单例类的一个最重要的特点是类的构造子是私有的 从而避免外界利用构造子直接创建出任意多的实例 值得指出的是 由于构造子是私有的 因此 此类不能被继承 57 懒汉式单例类 懒汉式单例类与饿汉式单例类相同之处是 类的构造方法是私有的 与饿汉式单例类不同的是 懒汉式单例类在第一次被引用时将自己实例化 如果加载器是静态的 那么在懒汉式单例类被加载时不会将自己实例化 58 懒汉式单例类 publicclassLazySingleton privatestaticLazySingletonm instance null privateLazySingleton synchronizedpublicstaticLazySingletongetInstance if m instance null m instance newLazySingleton returnm instance 读者可能会注意到 在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化 以处理多线程环境 59 使用单例模式的条件 使用单例模式有一个很重要的必要条件 在一个系统要求一个类只有一个实例时才应当使用单例模式 反过来说 如果一个类可以有几个实例共存 那么就没有必要使用单例类 60 错误例子一 问 我的一个系统需要一些 全程 变量 学习了单例模式后 我发现可以使用一个单例类盛放所有的 全程 变量 请问这样做对吗 答 这样做是违背单例模式的用意的 单例模式只应当在有真正的 单一实例 的需求时才可使用 一个设计得当的系统不应当有所谓的 全程 变量 这些变量应当放到它们所描述的实体所对应的类中去 将这些变量从它们所描述的实体类中抽出来 放到一个不相干的单例类中去 会使得这些变量产生错误的依赖关系和耦合关系 61 有状态的单例类 一个单例类可以是有状态的 stateful 一个有状态的单例对象一般也是可变 mutable 单例对象 有状态的可变的单例对象常常当做状态库 repositary 使用 比如一个单例对象可以持有一个int类型的属性 用来给一个系统提供一个数值惟一的序列号码 作为某个贩卖系统的账单号码 当然 一个单例类可以持有一个聚集 从而允许存储多个状态 62 没有状态的单例类 另一方面 单例类也可以是没有状态的 stateless 仅用做提供工具性函数的对象 既然是为了提供工具性函数 也就没有必要创建多个实例 因此使用单例模式很合适 一个没有状态的单例类也就是不变 Immutable 单例类 63 Java的Runtime对象 在Java语言内部 java lang Runtime对象就是一个使用单例模式的例子 在每一个Java应用程序里面 都有惟一的一个Runtime对象 通过这个Runtime对象 应用程序可以与其运行环境发生相互作用 Runtime类提供一个静态工厂方法getRuntime 通过调用此方法 可以获得Runtime类惟一的一个实例 Runtime对象通常的用途包括 执行外部命令 返回现有内存即全部内存 运行垃圾收集器 加载动态库等 importjava io publicclassCmdTest publicstaticvoidmain String args throwsIOException Processproc Runtime getRuntime exec notepad exe 64 Observer模式 Observer意图定义对象间的一种一对多的依赖关系 当一个对象的状态发生改变时 所有依赖于它的对象都得到通知并被自动更新 适用性当一个抽象模型有两个方面 其中一个方面依赖于另一方面 将这二者封装在独立的对象中以使它们可以各自独立地改变和复用 当对一个对象的改变需要同时改变其它对象 而不知道具体有多少对象有待改变 当一个对象必须通知其它对象 而它又不能假定其它对象是谁 换言之 不希望这些对象是紧密耦合的 65 Observer模式 假设今天您设计一个电子表格程序 当中有一个数据对象 您可以用表格图形对象 柱状图形对象 圆饼图形对象等方式来呈现对象 无论您是用哪种图形对象 重点是若数据对象的内容作了更改 则图形对象的内容也必须跟着修改 或许您的程序中有两个以上的图形对象来呈现数据 您在图形对象上更动数据 则另一个图形对象也必须作出相对应的变化 又假设您今天设计一个网络游戏 您在服务器上维护一个联机客户端共享的数据对象 当其中一个客户端作了操作 将对此数据对象作修改 则服务器必须通知其它客户端作相对应的变化 像是人物位置走动 建了一个城堡等 66 Observer模式 在Observer模式中的主角为主题 subject 与观察者 observer 观察者订阅它感兴趣的主题 一个主题可以被多个观察者订阅 当主题的状态发生变化时 它必须通知 notify 所有订阅它的观察者 观察者检视主题的状态变化 并作出对应的动作 67 Observer模式 Subject类中有一个notify 方法 通常是在Subject的状态发生改变时呼叫它 notify 中会呼叫Observer的update 方法 通常会先取得Subject的新状态 然后更新Observer的显示或行为 这个过程我们可以透过SequenceDiagram来表达 68 Observer模式 在Java中支持观察者模式 要成为观察者的类必须实现Observer接口 这个接口中定义了一个update 方法 这个方法会被主题对象在通知状态变化时呼叫 您必须在这个方法中实作您所想要的对应行为 主题对象会是Observable的子类 在这边注意两个重要的方法 setChanged 与notifyObserver setChanged 是用来设定主题对象的状态已经被改变 而notifyObserver 方法会通知所要订阅主题对象的观察者 调用其update 方法 69 Observer模式例子 publicclassObservable privatebooleanchanged false privateVectorobs 创建被观察者时就创建一个它持有的观察者列表 注意 这个列表是需要同步的 publicObservable obs newVector 添加观察者到观察者列表中去 publicsynchronizedvoidaddObserver Observero if o null thrownewNullPointerException if obs contains o obs addElement o 70 删除一个观察者 publicsynchronizedvoiddeleteObserver Observero obs removeElement o 通知操作 即被观察者发生变化 通知对应的观察者进行事先设定的操作 不传参数的通知方法 publicvoidnotifyObservers notifyObservers null 与上面的那个通知方法不同的是 这个方法接受一个参数 这个参数一直传到观察者里 以供观察者使用 publicvoidnotifyObservers Objectarg Object arrLocal synchronized this if changed return arrLocal obs toArray clearChanged for inti arrLocal length 1 i 0 i Observer arrLocal i update this arg 71 观察者publicinterfaceObserver Thismethodiscalledwhenevertheobservedobjectischanged An applicationcallsanObservableobject s notifyObserversmethodtohavealltheobject s observersnotifiedofthechange paramotheobservableobject paramarganargumentpassedtothenotifyObservers method voidupdate Observableo Objectarg 72 publicclassMailObserverimplementsObserver 这个类取名为MailObserver 顾名思义 她是一个用来发送邮件的观察者 publicvoidupdate Observableo Objectarg System out println 发送邮件的观察者已经被执行 publicclassJMSObserverimplementsObserver publicvoidupdate Observableo Objectarg System out println 发送消息给jms服务器的观察者已经被执行 73 publicclassSubjectextendsObservable 业务方法 一旦执行某个操作 则通知观察者 publicvoiddoBusiness if true super setChanged notifyObservers 现在还没有的参数 publicstaticvoidmain String args 创建一个被观察者Subjectsubject newSubject 创建两个观察者ObservermailObserver newMailObserver ObserverjmsObserver newJMSObserver 把两个观察者加到被观察者列表中subject addObserver mailObserver subject addObserver jmsObserver 执行业务操作subject doBusiness 74 Observer模式例子 执行结果发送消息给jms服务器的观察者已经被执行发送邮件的观察者已经被执行 75 Decorator 意图动态地给一个对象添加一些额外的职责 就增加功能来说 Decorator模式相比生成子类更为灵活 适用性在不影响其他对象的情况下 以动态 透明的方式给单个对象添加职责 处理那些可以撤消的职责 当不能采用生成子类的方法进行扩充时 一种情况是 可能有大量独立的扩展 为支持每一种组合将产生大量的子类 使得子类数目呈爆炸性增长 另一种情况可能是因为类定义被隐藏 或类定义不能用于生成子类 76 Decorator 装饰 77 为什么使用Decorator 我们通常可以使用继承来实现功能的拓展 如果这些需要拓展的功能的种类很繁多 那么势必生成很多子类 增加系统的复杂性 同时 使用继承实现功能拓展 我们必须可预见这些拓展功能 这些功能是编译时就确定了 是静态的 使用Decorator的理由是 这些功能需要由用户动态决定加入的方式和时机 Decorator提供了 即插即用 的方法 在运行期间决定何时增加何种功能 78 例子 抽象构件角色java代码packagedecorator publicinterfaceInterfaceComponent 组件方法say publicvoidsay 79 具体构件角色java代码packagedecorator publicclassComponentimplementsInterfaceComponent publicvoidsay System out println Component say 原组件的方法 80 抽象装饰者角色java代码packagedecorator publicabstractclassAbstractDecoratorimplementsInterfaceComponent privateInterfaceComponentcomponent publicAbstractDecorator InterfaceComponentcomponent ponent component 组件方法执行前预处理方法 protectedvoidpreSay 组件方法执行后处理方法 protectedvoidafterSay publicvoidsay preSay component say afterSay 81 具体装饰者二java代码packagedecorator publicclassDecoratorTwoextendsAbstractDecorator publicDecoratorTwo InterfaceComponentcomponent super component 根据需要重载模板类preSay 方法 protectedvoidpreSay System out println DecoratorTwo preSay 装饰者二的preSay 方法 根据需要重载模板类afterSay 方法 protectedvoidafterSay System out println DecoratorTwo afterSay 装饰者二的afterSay 方法 82 装饰者一java代码packagedecorator publicclassDecoratorOneextendsAbstractDecorator publicDecoratorOne InterfaceComponentcomponent super component 根据需要重载模板类preSay 方法 protectedvoidpreSay System out println DecoratorOne preSay 装饰者一的preSay 方法 根据需要重载模板类afterSay 方法 protectedvoidafterSay System out println DecoratorOne afterSay 装饰者一的afterSay 方法 测试方法 paramargs publicstaticvoidmain S

温馨提示

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

评论

0/150

提交评论