软件体系结构-7 体系结构设计模式.ppt_第1页
软件体系结构-7 体系结构设计模式.ppt_第2页
软件体系结构-7 体系结构设计模式.ppt_第3页
软件体系结构-7 体系结构设计模式.ppt_第4页
软件体系结构-7 体系结构设计模式.ppt_第5页
已阅读5页,还剩227页未读 继续免费阅读

下载本文档

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

文档简介

紧耦合的类很难独立的被复用 因为他们是相互依赖的松散耦合提高了一个类本身被复用的可能性 并且系统更易于学习 移植 修改和扩展Someonehasalreadysolvedyourproblems SoftwareArchitecturePerspectiveonanEmergingDiscipline 王备战wangbzM 0592 2580589 O 海韵园行政楼A座506 BecomingaChessMasterFirstlearnrulesandphysicalrequirements e g namesofpieces legalmovements chessboardgeometryandorientation etc Thenlearnprinciples e g relativevalueofcertainpieces strategicvalueofcentersquares powerofathreat etc However tobecomeamasterofchess onemuststudythegamesofothermasters Thesegamescontainpatternsthatmustbeunderstood memorized andappliedrepeatedlyTherearehundredsofthesepatterns Introduction BecomingaSoftwareDesignMasterFirstlearntherules e g thealgorithms datastructuresandlanguagesofsoftwareThenlearntheprinciples e g structuredprogramming modularprogramming objectorientedprogramming etc However totrulymastersoftwaredesign onemuststudythedesignsofothermasters Thesedesignscontainpatternsmustbeunderstood memorizedandappliedrepeatedlyTherearehundredsofthesepatterns Introduction ChapterSeven设计模式 概述设计模式的特点与应用设计模式的方法 概述设计模式产生于建筑学和人类学ChristopherAlexander 质量可以客观评价吗 Alexander C Ishikawa S Silverstein M TheTimelessWayofBuilding NewYork OxfordUniversityPress 1979 ChristopherAlexander把模式定义为 在某一个情景 Context 下的问题 Problem 解决方案 Solution 每个模式 通过一种让你可以无数次使用这一解决方案 而不必再次重复同样工作的方式 描述一个在我们的环境中重复出现的问题 并描述该问题解决方案的核心 Alexander描述这些人类建筑上的成果 ChapterSeven设计模式 ChapterSeven设计模式 概述设计模式产生于建筑学和人类学模式使人们遭遇到特定问题时大家惯用的应付方式 Alexander说一个模式的说明应该包括四个项目 模式名称 PatternName 一个助记名 词汇 描述模式的问题 解决方案和效果 便于交流和思考 找到恰当的模式名称也是设计模式编目的难点之一 问题 Problem 描述了何时使用模式 解决方案 Solution 描述了设计的组成成分 他们之间的相互关系及各自的职责和写作方式 抽象级别上的 针对一般设计问题 效果 Consequences 描述了模式应用的效果及使用模式应权衡的问题 时空 灵活性 扩充性 可移植性 ChapterSeven设计模式 概述设计模式产生于建筑学和人类学从建筑学转移到软件设计模式DevelopingsoftwareishardDevelopingreusablesoftwareisevenharderQuestion软件中是否有不断重复出现 可以用某种相同方式解决的问题 是否可能用 按照模式 首先识别出模式然后在模式的基础上创建特定的解决方案 的方法来设计软件 GOF 四人团 四人帮 Gamma Helm Johnson VlissidesGamma E Heml R Johnson R Vlissides j DesignPatterns ElementsofReusableObject OrientedSoftware ReadingMass Addison Wesley 中文版 设计模式 可复用面向对象软件的基础 李英军等译 机械工业出版社 2000年 它将设计模式的思想应用于软件设计 它描述了收录和描述设计模式的一个结构 它收录了23个模式 它在这些模式的基础上提出了面向对象策略及方法的原则 Provensolutionsincludepatternsandframeworks ChapterSeven设计模式 概述设计模式产生于建筑学和人类学从建筑学转移到软件设计模式设计模式的描述Patternscapturethestaticanddynamicstructuresandcollaborationsofsuccessfulsolutionstoproblemsthatarisewhenbuildingapplicationsinaparticulardomain模式的基本要素 ChapterSeven设计模式 概述设计模式产生于建筑学和人类学从建筑学转移到软件设计模式设计模式的描述GOF之模式要素 ChapterSeven设计模式 概述设计模式产生于建筑学和人类学从建筑学转移到软件设计模式设计模式的描述为什么要学习设计模式 复用解决方案 通过复用已经建立的设计 我为自己的问题找到了更高的起点并避免了绕弯路 我受益于学习别人的经验 我不必再为普通 重复的问题重新设计解决方案 建立通用的术语 交流与协作都需要一个共同的词汇基础 一个对问题的共同观点 设计模式在项目的分析和设计阶段提供了一个通用的参考点 更高的分析和设计的视角 在问题上 在设计和面向对象的过程中 模式给你一个更高层次的视角 这样的视角将你从 过早处理细节 的暴政中解放出来 AnExample 如何为橱柜制作抽屉 假设两个木匠正在讨论如何为橱柜制作抽屉的问题 木匠1 你认为我们应该怎样制作这些抽屉呢 木匠2 唔 我想我们应该这样做结合部分 在木材上直锯下去 然后回转45度锯 然后再直锯下去 再朝另一个方向回转45度锯 再直锯下去 然后 Doyouunderstandwhathesaidabout AnExample 如何为橱柜制作抽屉 木匠1 我们应该用一个燕尾接合还是一个斜面接合 斜面接合它是一个简单的解决方案 斜面接合是一个容易制造的接合 你只需将要接合的木材分别锯出45度的斜面 然后用钉子或胶水将它们接合起来 它是一个轻量级的解决方案 斜面接合比燕尾接合弱 在强压力下 它将不能再接合在一起 它不太显眼 斜面接合只有一处锯口 这比燕尾接合的多处锯口更不容易引起注意 我们已经看到了一个本质上的区别 木匠们讨论的是问题解决方案质量上的差异 他们的讨论是站在一个更高 更抽象的层次上的 他们可以避免陷入特定解决方案的泥沼 关键所在 应该用一个制作昂贵但既美观又耐用的接合 还是应该只用一个制作快速 不美观的接合来至少维持到检查结束 燕尾接合它是一个比较复杂的解决方案 制作一个燕尾接合涉及更多的问题 也就是说 实现它的代价更高 它不受温度和湿度影响 当这些条件变化时 木材会膨胀或收缩 但是 燕尾接合仍能保持坚固 它与连接系统无关 实际上 燕尾接合的工作甚至不需要胶水 它是一个比较美观的接合 当制作完成时 它看上去很漂亮 在第一个例子中 木匠2讨论接合的实现细节 结果模糊了真正的问题 在第二个例子中 木匠1希望根据接合的代价和质量来决定使用哪个接合方案 木匠1这样的更高的层次就是 木匠模式 的层次 它反映出木匠的真实设计问题 谁更有效率 你愿意跟谁一起工作 AnExample 如何为橱柜制作抽屉 ChapterSeven设计模式 概述设计模式产生于建筑学和人类学从建筑学转移到软件设计模式设计模式的描述为什么要学习设计模式 学习设计模式的其他优点改善团队和个人学习代码的可修改性得到改善设计模式阐述了基本的面向对象原则对改良策略的采用 甚至在模式不出现的时候针对接口编程 优先使用对象组合 而不是类继承 找到并封装变化点 ChapterSeven设计模式 概述设计模式产生于建筑学和人类学从建筑学转移到软件设计模式设计模式的描述为什么要学习设计模式 学习设计模式的其他优点改善团队和个人学习代码的可修改性得到改善设计模式阐述了基本的面向对象原则对改良策略的采用 甚至在模式不出现的时候了解 庞大的继承体系 的替代方案 ChapterSeven设计模式 概述设计模式产生于建筑学和人类学从建筑学转移到软件设计模式设计模式的描述为什么要学习设计模式 学习设计模式的其他优点WhatareDesignPatterns Recurringsolutionstodesignproblemsyouseeoverandover Asetofrulesdescribinghowtoaccomplishcertaintasksintherealmofsoftwaredevelopment FocusonreuseofrecurringarchitecturaldesignthemesAddressarecurringdesignproblemthatarisesinaspecificcontextandpresentsasolutiontoitDesignpatternsrepresentsolutionstoproblemsthatarisewhendevelopingsoftwarewithinaparticularcontext i e Patterns problem solutionpairsinacontext Patternscapturethestaticanddynamicstructureandcollaborationamongkeyparticipantsinsoftwaredesigns Theyareparticularlyusefulforarticulatinghowandwhytoresolvenon functionalforcesPatternsfacilitatereuseofsuccessfulsoftwarearchitecturesanddesigns ChapterSeven设计模式 概述设计模式产生于建筑学和人类学从建筑学转移到软件设计模式设计模式的描述为什么要学习设计模式 学习设计模式的其他优点WhatareDesignPatterns DesignPatternSpaceCreationalpatterns DealwithinitializingandconfiguringclassesandobjectsStructuralpatterns DealwithdecouplinginterfaceandimplementationofclassesandobjectsBehavioralpatterns Dealwithdynamicinteractionsamongsocietiesofclassesandobjects DesignPatternSpace DesignPatternSpace AbstractFactory 提供一个创建一系列相关或相互依赖对象的接口 而无需指定他们具体的类 Adapter 将一个类的接口转换成客户希望的另外一个接口 Adapter使得原本由于不兼容而不能一起工作的那些类可以一起工作 Bridge 将抽象部分与它的实现部分分离 使他们都可以独立地变化 ChainofResponsibility 为解除请求的发送者和接收者之间耦合而使多个对象都有机会处理这个请求 将这些对象连成一个链并沿着这条链传递该请求 直到一个对象处理它 Command 将一个请求封装为一个对象 从而使你可用不同的请求对客户进行参数化 对请求排队或者记录请求日志以及支持可取消的操作 Composite 动态的给一个对象添加一些额外的职责 Fa ade 为子系统中的一组接口提供一个一致的界面 Fa ade模式定义了一个高层接口 这个接口使得这一子系统更加容易实现 DesignPatternSpace FactoryMethod 定义一个用于创建对象的接口 让子类决定将那个类实例化 FactoryMethod使得一个类的实例化延迟到其子类 Flyweight 运用共享技术有效地支持大量细粒度的对象 Interpreter 给定一个语言 它定义它的文法的一种表示 并定义一个解释器 该解释器使用该表示来解释语言中的句子 Iterator 提供一种方法顺序访问一个聚合对象中各元素 而又不需暴露该对象的内部表示 Mediator 用一个中介对象来封装一系列的对象交互 中介者使各对象不需要显式地相互引用 从而使其耦合松散 而且可以独立地改变他们之间的交互 Memonto 在不破坏封装性的前提下 捕获一个对象的内部状态 并在该对象之外保存这个状态 这样以后就可将该对象恢复到保存的状态 Observer 定义对象间的一种一对多的依赖关系 以便当一个对象的状态发生改变时 所有依赖于它的对象都得到通知并自动刷新 Prototype 用原型实例制定创建对象的种类 并且通过拷贝这个原型来创建新的对象 Proxy 为其他对象提供一个代理以控制对这个对象的访问 Singleton 保证一个类仅有一个实例并提供一个访问它的全局访问点 DesignPatternSpace State 允许一个对象在其内部状态改变时改变它的行为 对象看起来似乎修改了它所属的类 Strategy 定义一系列算法 把他们一个个封装起来 并且使他们可相互替换 本模式使得算法的变化独立于使用他们的客户 TemplateMethod 定义一个操作中的算法骨架 而将一些步骤延迟到子类中 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 Visitor 表示一个作用于某对象结构中的个元素的操作 它使你可以在不改变个元素的类的前提下定义作用于这些元素的新操作 DesignPatternSpace ChapterSeven设计模式 概述设计模式产生于建筑学和人类学从建筑学转移到软件设计模式设计模式的描述为什么要学习设计模式 WhatareDesignPatterns ChapterSeven设计模式 概述设计模式的特点与应用设计模式的方法 ChapterSeven设计模式 设计模式的特点与应用软件设计模式的概念得益于ChristopherAlexander的工作 他将模式语言 PatternLanguage 成功应用于城市建筑领域 导致了软件领域内应用模式的讨论 ChristopherAlexander说 每一个模式描述了一个在我们周围不断重复发生的问题 以及该问题的解决方案的核心 这样 你就能一次又一次地使用该方案而不必做重复劳动 尽管Alexander所指的是城市建筑模式 但他的思想也同样适用于面向对象设计模式 只是在面向对象的解决方案里 我们用对象和接口代替了建筑中的墙壁和门窗 建筑 和 软件 这两类问题的核心都在于提供相关问题的解决方案 设计模式 就是 在特定环境 Context 下 对特定问题 Problem 的惯用解决之道 Solution ChapterSeven设计模式 设计模式的特点与应用SmalltalkMVC中的设计模式在Smalltalk 80中 类的模型 视图 控制器 MVC Model View Controller 三元组被用来构建用户界面 透过MVC来看设计模式将帮助我们理解 模式 的含义 MVC包括三类对象 模型 Model 是应用对象 所有的操作都在这里实现 它若需要取得视图中的对象或更新视图 需通过控制器来进行处理 视图 View 是模型在屏幕上的表示 模型在进行操作后 其结果是通过视图显示的 控制器 Controller 用于管理用户与视图发生的交互 定义用户界面对用户输入的响应方式 一旦用户需要对模型进行处理 不能直接执行模型 而必须通过控制器间接实现的 不使用MVC 用户界面设计往往将这些对象混在一起 而MVC则将它们分离以提高灵活性和复用性 ChapterSeven设计模式 ChapterSeven设计模式 设计模式的特点与应用SmalltalkMVC中的设计模式MVC通过建立一个 定购 通知 协议来分离视图和模型 视图必须保证它的显示正确地反映了模型的状态 一旦模型的数据发生变化 模型将通知有关的视图 每个视图相应地得到刷新自己的机会 这种方法可以让你为一个模型提供不同的多个视图表现形式 也能够为一个模型创建新的视图而无需重写模型 下图显示了一个模型和三个视图 图中省略了控制器 组成的设计模式示意图 模型包含一些数据值 视图通过电子表格 柱状图 饼图不同的方式来显示这些数据 当模型的数据发生变化时 模型就通知它的视图 而视图将与模型通信以访问这些数据 ChapterSeven设计模式 ChapterSeven设计模式 设计模式的特点与应用SmalltalkMVC中的设计模式表面上看 这个例子反映了将视图和模型分离的设计 然而 这个设计还可以用于解决更一般的问题 将对象分离 使得一个对象的改变能够影响到另一些对象 而这个对象并不需要知道那些被影响的对象的细节 这个更一般的模式被描述成Observer模式 Views可以看作一棵树 显然可以用CompositePattern来实现 MVC允许你在不改变视图外观的情况下改变视图对用户输入的响应方式 例如 你可能希望改变视图对键盘的响应方式 或希望使用弹出菜单而不是原来的命令键方式 MVC将响应机制封装在Controller对象中 存在着一个Controller的类层次结构 使得可以方便地对原有Controller做适当改变而创建新的Controller ChapterSeven设计模式 设计模式的特点与应用SmalltalkMVC中的设计模式View使用Controller子类的实例来实现一个特定的响应策略 要实现不同的响应策略只要用不同种类的Controller实例替换即可 甚至可以在运行时刻通过改变View的Controller来改变View对用户输入的响应方式 例如 一个View可以被禁止接收任何输入 只需给它一个忽略输入事件的Controller View Controller关系是Strategy模式的一个例子 一个策略是一个表述算法的对象 当你想静态或动态地替换一个算法 或你有很多不同的算法 或算法中包含你想封装的复杂数据结构 这时策略模式 Strategy 是非常有用的 MVC还使用了其它的设计模式 如 用来指定视图缺省控制器的FactoryMethod和用来增加视图滚动的Decorator 装饰器 但是 MVC的主要关系还是由Observer Composite 组合 和Strategy三个设计模式给出的 MVC模式是一种架构模式 需要其他模式协作完成 ChapterSeven设计模式 设计模式的特点与应用MVC ApplicationtoJ2EE J2EEServer View Controller Database Model Persistence WebBrowser TransferServlet TransferEJB TransferResultJavaBean HTMLDoc 5 2 3 4 6 7 1 BalanceJSP MVC ApplicationtoJ2EE TheModel View ControllerPattern Model View Controller MVC isadesignpatternVerywidelyusedandregardedasacoreconceptinJ2EEdevelopmentThemodelRepresentstheunderlyingdataandbusinesslogicinoneplaceContainsnoinformationabouttheuserinterfaceTheviewTheuserinterface thingstheusercanseeandrespondtoRepresentawindowintothemodel therecanbemanyoftheseThecontrollerConnectsthemodelandtheviewUsedtocommunicatebetweenthemodelandviewAfourthlayer persistence isoftenaddedtothepattern MVC Benefits PromotescodereuseThepurposeofthemodelistoprovidebusinesslogicanddataaccessinoneplaceThislogiccanbereusedinmanyapplicationsatthesametimewithouttheneedforanyextracodingReducesdevelopmenttimeThemodel view andcontrollercanbedevelopedinparallelMoremaintainableTheviewcanbechangedwithoutaffectingthemodelAWebpageviewcanbechangedtodisplayachartinsteadofatablewithnochangetothemodelThemodelcanbechangedwithoutaffectingtheviewForexample thewayinwhichaninsurancepremiumiscalculatedmaychange buttheinterfacetothebusinessmethodremainsthesameDatacanbemovedwithoutaffectingtheviewormodelThelayeringconceptallowsformoreflexibility MVC DownSides 开发期间花费相当多的时间考虑如何将MVC运用到我们的应用程序当中由于MVC严格分离 给调试带来了一定的困难 MVC意味着我们要管理较以前更多的文件 MVC不适合小型应用程序的开发 因为得不偿失 但如果我们肯接受MVC 并且有能力应付它所带来的额外的工作和复杂性 MVC将使我们的系统在健壮性 可维护性 可复用性方面 结构方面上一个新的台阶 ChapterSeven设计模式 设计模式的特点与应用使用设计模式的原因尽力用一种标准的方式描述设计经验 为设计者提供一种通用的语言 增加复用性 减少设计的多样性 增强设计变更的灵活性 提高设计文档的质量 增强设计的可理解性 学习使用设计模式的方法使用工具 面向对象语言开发运行环境 C java UML建模工具 Rose RSA 理解各种设计模式 Gof的23种设计模式 描述的基本概念 分析典型的应用 JDK核心类库 扩展类库 j2ee平台等 DesignPattern不等于类函数库类函数库中确实用到了DesignPattern图不能只是看 要仔细解读仔细琢磨范例 不断实践 ChapterSeven设计模式 概述设计模式的特点与应用设计模式的方法 设计模式的方法 漫谈UML在1989年到1994年间 面向对象的方法从10种增加到50种以上 面对这么多的方法 很多用户很难找到一种完全满足他们要求的建模语言 于是就加剧了所谓的方法战争 因此需要一种统一的和一致的可视化语言 1994年 GradyBooch Grady博士于2003年3月荣获IBM名士IBMfellow的称号 IvarJacoboson 博士 IBM 和JamesRumbaugh 博士 IBM 开始彼此从对方的方法中吸纳思想 他们的关于面向对象方法的共同成果促成了UML的诞生 1997年1月UML1 0版本提交给OMG并获得通过 UML1 0成为业界标准的建模语言 1998年秋季 RTF发布了UML1 3版本 2003年6月 OMG技术会议上UML2 0获得正式通过 设计模式的方法 漫谈UML类图类和层次的关系类名称字段名称方法名称abstract类abstract方法static字段static方法类的继承关系箭头方向的问题 设计模式的方法 漫谈UML类图类和层次的关系接口与实现接口的名称为斜体虚线表示实现关系 设计模式的方法 漫谈UML类图类和层次的关系接口与实现聚合aggregation白色菱形的直线代表聚合关系Means 把东西放在菱形容器上 设计模式的方法 漫谈UML类图类和层次的关系接口与实现聚合aggregation存取控制UML只要在方法或字段的名称前面加上符号 就可以表示存取控制 表示是public方法或字段 表示是private方法或者字段 表示是protected方法或字段 设计模式的方法 漫谈UML类图类间的关联性处理流程和对象间的协调顺序图 设计模式的方法 TypesOfSoftwarePatternsAnalysisDesignOrganizationalProcessProjectPlanningConfigurationManagement 设计模式的方法 GoFClassificationOfDesignPatternsPurpose whatapatterndoesCreationalPatternsConcerntheprocessofobjectcreationStructuralPatternsDealwiththecompositionofclassesandobjectsBehavioralPatternsDealwiththeinteractionofclassesandobjects 设计模式的方法 Scope whatthepatternappliestoClassPatternsFocusontherelationshipsbetweenclassesandtheirsubclassesInvolveinheritancereuseObjectPatternsFocusontherelationshipsbetweenobjectsInvolvecompositionreuse 设计模式的方法 SingletonNameTheSingletonPattern yourtickettocreatingone of akindobjects forwhichthereisonlyoneinstance Singleton 单件 唯一的对象实例 孤子模式 单态属于创建模式 对象的创建模式意图Singleton模式的用途是 ensureaclasshasonlyoneinstance andprovideaglobalpointofaccesstoit 确保每个类只有一个实例 并提供它的全局访问点 应该由类本身来负责只使用一个类实例 而不是由类用户来负责 应该始终不要让类用户来监视和控制运行的类实例的数量 HowToDo 能确保只有一个类的实例的时候的Pattern就称为 SingletonPattern Singleton 适用性当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时 Forexample YoursystemmighthaveonlyonewindowmanagerorprintspooleroronepointofaccesstoaDBengeine oryourcomputermighthaveseveralserialport buttherecanonlybeoneinstanceofCOM1 结构SeeExample Singleton 参与者Singleton定义一个Instance操作 允许客户访问它的唯一实例 Instance是一个类操作 负责创建它自己的唯一实例 效果对唯一实例的受控访问允许可变数目的实例实现SeeExample Singleton 类图代码Main javaSingleton java设限的理由如果有一个以上的对象存在 对象之间彼此影响 可能会出现Bug保证只有一个实例的存在 程序员就可以在这个前提下放心的编写程序回顾SingletonPattern保证了只有一个对象存在 编写static方法以取得对象的实例构造函数设置成private保证了构造函数不会被从Singleton类外调用构造函数InJFC masaSingleton 设计模式的方法 AdapterName适配器 别名 Wrapper属于结构模式动机为复用而设计的类不能够被复用的原因仅仅是因为接口与专业应用领域所需要的接口不匹配Canbeusedtomakeoneclassinterfacematchanotherforeasierprogramming 适用性你想使用一个已经存在的类 而它的接口不符合你的要求结构 效果 参与者 SeeExample Adapter 适配器 适配器的功能是介入既有内容和需要结果之间 作为沟通的桥梁 ACAdapter换个包装再度利用具有填平 既有内容 和 需要结果 两者间 落差 的DesignPattern就是AdapterPatternAdapterPattern又称为WrapperPatternAdapterPattern有下列两种类的AdapterPattern 继承 对象的AdapterPattern 委托 Adapter 将一个类的接口转换成客户希望的另外一个接口 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 Adapter 适配器 Example 类的AdapterPattern 把字符串输出成 Hello 放在小括弧内 或者 Hello 放在 内 Adapter 适配器 负责适配器功能的是PrintBanner类继承既有的Banner类实现需要的print接口 Adapter 适配器 SourceBanner类Banner javaPrint接口Print javaPrintBanner类PrintBanner javaMain类Main java Adapter 适配器 点评Main java中将PrintBanner的对象实例指定到了Print接口类型的变量 Main在利用Print这个接口来写程序从Main的代码中完全看不出有Banner类的存在我们完全可以不需要修改Main类就可以修改Banner类Main类并不知道系统会以什么样的方式执行PrintBanner类 换个说法 这个不知道也就是不需要修改Main类就可以直接修改PrinBanner类了 Adapter 适配器 Example 对象的AdapterPattern 第一个例子中是 利用 继承 让 既有内容 符合 需要结果 利用 委托 Java语言中委托就是指把某个方法的实际处理交给其他对象的方法进行 Adapter 适配器 Example 对象的AdapterPattern Java中只允许单继承 如何Adapter Print javaBanner javaPrintBanner javaMain java Adapter 适配器 启发为何要用 什么时候用Adapter 设计模式的方法 TemplateMethod类行为型模式何谓模板 Template TemplateMethodPattern是什么 模板方法意图 定义一个操作中的算法骨架 而将一些步骤延迟到子类中 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 动机 模板方法使用抽象操作定义算法的先后顺序 而子类将重新定义这些操作以提供具体的行为 适用性 一次性实现一个算法的不变的部分 并将可变的行为留给子类来实现各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复控制子类扩展 TemplateMethodPattern 效果模板方法是一种代码复用的基本技术 在类库中尤为重要 模板方法导致一种反向的控制结构 别找我们 我们找你 指的是一个父类调用一个子类的操作 而不是相反 结构 参与者 代码示例 SeeExample TemplateMethodPattern ExampleAbstractDisplay javaCharDisplay javaStringDisplay javaMain java TemplateMethodPattern 启发逻辑可共享TemplateMethodPattern究竟有什么好处 因为父类的模板已经实现了算法 所以子类就不需要重新逐一实现算法 如果不采用TemplateMethodPattern会如何 逐一修改所有的ConcreteClass 麻烦子类应视同父类向上转型 TemplateMethodPattern 启发父类对子类的要求Subclassresponsibility抽象类的意义父类和子类之间的协调思考题1 display的方法前为何要加上final 2 TemplateMethodPattern中我们可否用接口替代AbstractClass HomeWork什么是IoC InversionofControl DIP DependencyInversionPrinciple DependencyInjection模式 举例说明 设计模式的方法 迭代这个名词对于熟悉Java的人来说绝对不陌生 我们常常使用JDK提供的迭代接口进行javacollection的遍历 Iteratorit list iterator while it hasNext using it next dosomebusinessslogic 而这就是关于迭代器模式应用很好的例子 设计模式的方法 NameInterator 迭代器 游标 Cursor 属于行为模式 关于对象的为容器而生意图提供一种方法顺序访问一个聚合对象中各个元素 而又不暴露该对象的内部表示Theiteratorpatternisoneofthesimplestandmostfrequentlyusedofthedesignpatterns Itallowsyoutomovethroughalistorcollectionofdatausingastandardinterfacewithouthavingtoknowthedetailsofthatdata sinternalrepresentations Youcanalsodefinespecialiteratorsthatperformsomespecialprocessingandreturnonlyspecifiedelementsofthedatacollection Iterator 迭代器 动机一个聚合对象 EG List 应该提供一种方法来让别人可以访问它的元素而又不暴露它的内部结构 迭代器模式可以帮助我们解决这个问题 这个模式的关键思想是 将对列表的访问和遍历从列表对象中分离出来并放入一个迭代器对象中 迭代器定义了一个访问该列表元素的接口 for inti 0 i arr length i System out println arr i 在设计Pattern时 变量i的功能抽象化 结果就称为 IteratorPattern Iterator 迭代器 适用性访问一个聚合对象的内容而无需暴露它的内部结构支持对聚合对象的多种遍历为遍历不同的聚合结构提供一个统一的接口结构 SeeExample参与者Iterator迭代器定义访问和遍历元素的接口ConcreteIterator具体迭代器实现迭代器接口对该聚合遍历时跟踪当前位置Aggregate聚合定义创建相应迭代器对象的接口ConcreteAggregate具体聚合实现创建相应迭代器的接口 该操作返回ConcreteIterator的一个适当的实例 Iterator 迭代器 效果它支持以不同的方式遍历一个聚合简化了聚合的接口实现 SeeExample Iterator 迭代器 程序 把书籍 Book 放到书架 BookShelf 上 并依次输出书名 Iterator 迭代器 源码Aggregate接口Aggregate javaIterator接口Iterator javaBook类Book javaBookShelf类BookShelf javaBookShelfIterator类BookShelfIterator javaMain类Main java Iterator 迭代器 迭代模式 迭代模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象 多个对象聚在一起形成的总体称之为聚集 聚集对象是能够包容一组对象的容器对象 迭代模式将迭代逻辑封装到一个独立的子对象中 从而与聚集本身隔开 迭代模式简化了聚集的界面 每一个聚集对象都可以有一个或一个以上的迭代对象每一个迭代状态可以是彼此独立的迭代算法可以独立于聚集角色变化 InJFC thereisaninterfacenameIterator Iterator 迭代器 点评为什么要在IteratorPattern这么麻烦的东西上花费时间 为什么除了聚合之外 还要特别建立像Iterator这样的参与者 Answers利用Iterator可以跟实现分开 这里只用到了hasNext和next这两个Iterator的方法 并没有用到BookShelf实现时所用到的方法 换句话说 这里的while循环不会受到BookShelf实现的影响 While it hasNext Bookbook Book it nextSystem out println book getName Iterator 迭代器 启发只用具体类就能解决所有问题的感觉会让人不知不觉上瘾 但 过度依赖具体类反而会提高类与类的耦合度 增加零部件复用的困难 为了降低耦合度 让类作为零部件再利用 必须引进抽象类和接口的概念 切记 不要只用具体类写程序 要利用抽象类和接口才对 各种Iterator由后往前的反向遍历由前往后 由后往前的双向遍历指定号码 立即跳跃过去遍历总结 IteratorPattern告诉我们如何用固定的方法递增计算聚合内元素 InJava ThereisaninterfacenamedIterator SEEJavaDocHomeWork 分析Java中Iterator的代码 设计模式的方法 FactoryMethod 工厂方法 定义一个创建对象的接口 让子类决定实例化哪个类 使得一个类的实例化延迟到其子类 别名 虚构造器 VirtualConstructor 动机 框架使用抽象类定义和维护对象之间的关系 这些对象的创建通常也由框架负责 FactoryMethod负责生产一个对象 FactoryMethod 适用性当一个类不知道它所创建的对象的类的时候当一个类希望由它的子类来指定它所创建的对象的时候结构 参与者 代码示例 SeeExample FactoryMethod FactoryMethodPattern在父类规定对象的创建方法 但并没有深入到较具体的类名 所有具体的完整内容都放在子类 Example 建立一个生产身份证的工厂Factory javaProduct javaIDCardFactory javaIDCard javaMain java FactoryMethod 工厂方法 FactoryMethodPattern的类图Product规定了此Pattern所产生的对象实例应有的接口 具体内容则由子类ConcreteProduct参与者决定 该类描述的是框架Creator是产生Product的抽象类 具体内容由ConcreteCreator决定 Creator对于实际产生的ConcreteProduct一无所知 唯一知道的就是调用Product和产生新对象的方法 该类描述的框架ConcreteProduct 实际处理内容的部分 规定了产品的样式 ConcreteCreator 实际处理内容的部分 规定了制造实际产品的类 FactoryMethod 工厂方法 启发框架与内容分别属于framework包和idcard包可否利用同一个框架建立不同的 工厂 和 产品 怎样去生产TV 建立TV的包 并导入framework即可注意到了没有 framework没有导入idcard包 在idcard包中导入了framework包Product和Factory中没有任何具体的类名因此 如果要用同一个框架产生新类时 完全不用做任何修改 在一个Pattern中不同的类和接口负责不同的功能 运行时又保持彼此间的互动关系 要注意类和接口之间的互动关系上 仅有白雪公主角色的戏没法演 设计模式的方法 Prototype 原型 Injava newOneClass如果不是利用类产生对象 而是从一个对象实例产生出另外一个新对象实例 这就是PrototypeJustAS BuySth OrEatSth Prototype 原型 意图 用原型实例指定创建对象的种类 并且通过拷贝这些原型创建新的对象动机 通过拷贝原型来创建新的对象 减少类的数目适用性当要实例化的类是在运动时刻指定时结构 参与者 代码示例 SeeExample Prototype 原型 Example 以各种形式输出字符串 加下划线 加边框etc Prototype 原型 protectedObjectclone throwsCloneNotSupportedExceptionCreatesandreturnsacopyofthisobject Thegeneralintentisthat foranyobjectx theexpression x clone xwillbetrue andthattheexpression x clone getClass x getClass willbetrueWhileitistypicallythecasethat x clone equals x willbetrueclone方法由Object定义Example sSource Product javaManager javaMessageBox javaUnderlinePen javaMain java Prototype 效果对客户隐藏了具体的产品类 因此减少了客户知道的名字的数目运行时刻增加和删除产品 动态配置应用克隆一个原型类似于实例化一个类 原型模式极大的减少了系统所需的类的数目 Prototype 原型 启示 在Product接口和Manager

温馨提示

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

评论

0/150

提交评论