《软件工程的23种设计模式的UML类图frkj.docx》由会员分享,可在线阅读,更多相关《软件工程的23种设计模式的UML类图frkj.docx(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、二 十三三种设计计模式0 引言言谈到设计计模式,绝绝对应该该一起来来说说重重构。重重构给我我们带来来了什么么?除了了作为对对遗留代代码的改改进的方方法,另另一 大大意义在在于,可可以让我我们在写写程序的的时候可可以不需需事先考考虑太多多的代码码组织问问题,当当然这其其中也包包括了应应用模式式的问题题。尽管管大多数数开发者者都已经经养成了了写代码码前先 从设计计开始的的习惯,但但是,这这种程度度的设计计,涉及及到到大大局、到到总体架架构、到到主要的的模块划划分我觉觉得就够够了。换换句话说说,这时时就能写写代码了了。这就就得益于于重构的的思想 了。如如果没有有重构的的思想,有有希望获获得非常常高质
2、量量的代码码,我们们就不得得不在开开始写代代码前考考虑更多多其实并并非非常常稳定的的代码组组织及设设计模式式的应用用问题,那那开发效效率 当当然就大大打折扣扣了。在在重构和和设计模模式的合合理应用用之下,我我们可以以相对较较早的开开始写代代码,并并在功能能尽早实实现的同同时,不不断地通通过重构构和模式式来改善善我们的的代码质质 量。所所以,下下面的章章节中,在在谈模式式的同时时,我也也会谈谈谈关于常常用的这这些模式式的重构构成本的的理解。重重构成本本越高意意味着,在在遇到类类似的问问题情形形的时候候,我们们更应该该 提前前考虑应应用对应应的设计计模式,而而重构成成本比较较低则说说明,类类似的情
3、情形下,完完全可以以先怎么么方便,怎怎么快怎怎么写,哪哪怕代码码不是很很优雅也也没关系系,回头头再重构构也很容容 易。1 创建建型1.1FFacttoryyMetthodd思想:FFacttoryy Meethood的主主要思想想是使一一个类的的实例化化延迟到到其子类类。场景:典典 型的的应用场场景如:在某个个系统开开发的较较早阶段段,有某某些类的的实例化化过程,实实例化方方式可能能还不是是很确定定,或者者实际实实例化的的对象(可可能是需需要对象象的某个个子类中中的一 个)不不确定,或或者比较较容易变变化。此此时,如如果直接接将实例例化过程程写在某某个函数数中,那那么一般般就是iif-eels
4、ee或seelecct-ccasee代 码码。如果果,候选选项的数数目较少少、类型型基本确确定,那那么这样样的iff-ellse还还是可以以接受的的,一旦旦情形变变 得复复杂、不不确定性性增加,更更甚至包包含这个个构造过过程的函函数所在在的类包包含几个个甚至更更多类似似的函数数时,这这样的iif-eelsee代 码码就会变变得比较较不那么么容易维维护了。此此时,应应用本模模式,可可以将这这种复杂杂情形隔隔离开,即即将这类类不确定定的对象象的实例例化过程程延迟到到子类。实现:该该模式的的典型实实现方法法就是将将调用类类定义为为一个虚虚类,在在调用类类定义一一个专门门用于构构造不确确定的对对象实例
5、例的虚函函数,再再将实际际的对象象实例化化代码 留到调调用类的的子类来来实现。如如果,被被构造的的对象比比较复杂杂的话,同同时可以以将这个个对象定定义为可可以继承承、甚至至虚类,再再在不同同的调用用类的子子类中按按需返回回被构造造类的子子 类。重构成本本:低。该该模式的的重构成成本实际际上还与与调用类类自己的的实例化化方式相相关。如如果调用用类是通通过Faactoory方方 式(此此处“FFacttoryy方式”泛泛指对象象的实例例化通过过Facctorry MMethhod或或Absstraact Facctorry这样样的相对对独立出出来的 方式构构造)构构造的,那那么,重重构成本本相对就
6、就会更低低。否则则,重构构时可能能除了增增加调用用类的子子类,还还要将所所有实例例化调用用类的地地方,修修改为以以新增的的子类代代替。可可能这 样的子子类还不不止一个个,那就就可以考考虑迭代代应用模模式来改改善调用用类的实实例化代代码。1.2AAbsttracctFaactoory思想:不不直接通通过对象象的具体体实现类类,而是是通过使使用专门门的类来来负责一一组相关关联的对对象的创创建。场景:最最典型的的应用场场景是:您只想想暴露对对象的接接口而不不想暴露露具体的的实现类类,但是是又想提提供实例例化对象象的接口口给用户户;或者者,您希希望所有有的对象象能够 集中在在一个或或一组类类(通常常称
7、作工工厂类)来来创建,从从而可以以更方便便的对对对象的实实例化过过程进行行动态配配置(此此时只需需要修改改工厂类类的代码码或配置置)。实现:该该模式的的实现是是比较清清晰简单单的,如如上图,就就是定义义创建和和返回各各种类对对象实例例的工厂厂类。在在最复杂杂而灵活活的情形形,无论论工厂类类本身还还是被创创建 的的对象类类都可能能需要有有一个继继承体系系。简单单情形其其实可以以只是一一个工厂厂类和需需要被创创建的对对象类。不不一定非非要像上上图中结结构那么么完备(累累赘)。重构成本本:中。如如果一开开始所有有的对象象都是直直接创建建,例如如通过nnew实实例化的的, 而而之后想想重构为为Abss
8、traact Facctorry模式式,那么么,很自自然的我我们需要要替换所所有直接接的neew实 例化代代码为对对工厂类类对象创创建方法法的调用用。考虑虑到像RReshharpper这这样的重重构工具具的支持持,找出出对 某某个方法法或构造造函数的的调用位位置这样样的操作作相对还还是比较较容易,重重构成本本也不是是非常高高。同时时,重构构成本还还和被创创建对象象的构造造函数的的重载数数量相关关。您需需要根据据实 际际情况考考虑,是是否工厂厂类要映映射被创创建对象象的所有有重载版版本的构构造函数数。1.3BBuillderr思想:将将一个类类的创建建过程和和他的主主体部分分分离。场景:该该模式
9、的的典型的的应用场场景是:一个类类的创建建过程可可能比较较复杂,或或者创建建过程中中的某些些阶段可可能会容容易变化化;或者者多个类类的创建建过程比比较类似似, 但但是主体体不同。实现:在在 以上上提到的的两种场场景中,我我们就可可以取出出一个类类的创建建过程的的代码,定定义一个个专门的的Buiildeer类, 而在原原来创建建类对象象实例的的地方,将将这个BBuillderr类的实实例作为为参数传传入。还还有第二二个重点点,就是是Buiildeer类 可以将将将整个个创建过过程分为为几个阶阶段,每每个阶段段不必在在类中直直接实现现,而可可以通过过继承体体系在子子类中实实现,或或者通过过子类的的
10、方法过过载来修修改创建建过程中中的某个个阶段, 但是重重用其他他的阶段段。可以以发现,该该模式将将一个对对象的复复杂创建建过程重重用到非非常高的的层次。这这正是它它的意义义所在。重构成本本:低。该该模式的的重构成成本我觉觉得是非非常低的的,因为为一般来来讲,创创建过程程的代码码本来也也就应该该在原来来的类的的构造函函数中,把把它Exxtraact出出 来就就好了。如如果发现现多个类类的创建建过程有有比较多多的代码码重复或或类似,那那么就可可以重用用这些提提取出来来的Buuildder类类 或者者Buiildeer类中中的某些些阶段。1.4PProttotyype思想:克克 隆一一个已有有的类的
11、的实例(大大家相比比都用过过甚至写写过类的的Cloone实实现,应应该很容容易理解解了)。场景:应应 用CClonne的场场景应该该说非常常多,理理想情况况下我当当然希望望任何类类都能CClonne, 需要的的时候就就能Cllonee一份一一模一样样的出来来。实现:这这 里将将的实现现主要之之实现的的表现形形式,而而不是如如何用具具体的语语言来实实现。因因此,只只要为需需要Cllonee能力 的类定定义一个个Cloone方方法就行行。当然然,一般般,主流流的程序序语言框框架都已已经定义义了通用用的Cllonee接 口口(当然然也可以以自己定定义),继继承并实实现该接接口和方方法就好好。重构成本
12、本:极低低。不多多解释了了吧。1.5 Sinngleetonn思想:保保证一个个类只有有一个唯唯一的实实例。场景:生生活中有有些对象象就是只只要一个个就好了了,我们们的代码码中为什什么要每每次都为为这样的的对象生生成一个个实例呢呢?实现:最最 简单单的实现现方式就就是使用用一个sstattic型型的类实实例,每每次对该该对象的的创建请请求都返返回这个个staaticc的 唯唯一实例例就行。重构成本本:极低低。2 结构构型2.1AAdappterr思想:将将一个类类的接口口转换成成另外一一个接口口,使得得原本由由于接口口不兼容容而不能能一起工工作的那那些类可可以一起起工作。场景:该该 模式式的应
13、用用场景太太多了,很很多需要要的功能能模块的的接口和和我们需需要的不不完全一一致或者者有多余余或不足足,但是是需要和和我们的的系统协协同工作作,通过过Adaapteer把 它包装装一下就就能让使使它接口口兼容了了。实现:定定 义一一个Addaptter类类,包含含需要包包装的类类,实现现需要的的其它接接口,调调用被包包装的类类的方法法来实现现需要 的接口口。重构成本本:低。2.2BBriddge思想:将将一个类类的抽象象定义和和具体实实现解耦耦。场景:该该 模式式的典型型应用场场景是:一个类类的抽象象定义已已经确定定,但是是,其实实现代码码甚至原原理可能能会不同同。比如如:我们们最熟悉悉的图形
14、形界面中中的wiindoow的 实现,无无论在什什么操作作系统,什什么平台台的机器器上,一一个wiindoow应具具有的抽抽象定义义基本上上是一致致的, 但是,其其实现代代码肯定定会因为为平台不不同,机机器的代代码指令令不同而而不同。此此时,如如果希望望您写的的winndoww类 能能跨平台台,应用用Briidgee模式就就是一个个好主意意。实现:该该 模式式的实现现方法很很简单,就就是除了了定义类类的抽象象定义之之外,将将一个类类的所有有实现代代码独立立出一个个实现类类。这样样一来,无无论是抽抽象定义义还是实实现类都都能分别别修改和和重 用用,但只只要两部部分的交交互接口口不变,还还是可以以
15、方便的的互相组组装。当当然,实实际上也也没有必必要隔离离出“所所有实现现代码”,只只需要隔隔离需要要的部分分就行了了。因此此,也可可以 说说,从代代码结构构来看,BBuillderr模式是是一种变变种的BBriddge模模 式的的。也经经常有人人将Brridgge模式式和接口口相比较较,如果果隔离出出所有的的实现,那那么的确确接口的的方式也也能 做做到抽象象定义和和实现分分离,但但是,BBriddge有有其优势势如下:一、究究竟隔离离多少代代码到BBriddge类类 中可可以灵活活确定,二二、减少少了总的的类的数数目,三三、允许许被隔离离出来的的Briidgee类被其其它的类类直接共共享 使使
16、用。重构成本本:中。将将所有的的(或很很大部分分)实现现代码分分离开来来总还是是一件不不大,但但是,也也不小的的事。所所以标个个“中”在在这里。:)2.3CCompposiite思想:将将 对象象组合成成树形结结构以表表示“部部分-整整体”的的层次结结构,使使得用户户对单个个对象和和组合对对象的使使用具有有一致 性。场景:该该 模式式的应用用场景极极其类似似,比如如像图形形系统,如如电路设设计、UUML建建模系统统,或者者像weeb的 显示元元素等,都都是那种种需要整整体和部部分具有有使用接接口上的的一定的的一致性性的需求求的结构构,实际际上,我我觉得这这样的系系统如果果不使用用Commpos
17、sitee模 式式将会是是惨不忍忍睹的。实现:该该模式的的实现主主要就是是要表示示整体或或部分的的所有类类都继承承自同一一的基类类或接口口,从而而拥有使使用接口口上一定定的一致致性。重构成本本:高。2.4DDecoorattor思想:为为一个对对象已有有的子类类添加一一些额外外的职责责。场景:该该模式的的使用场场景,主主要是有有的时候候我们不不愿意定定义逻辑辑上新的的子类,因因为没有有新的逻逻辑含义义上的子子类概念念,而只只是想为为一个已已存在的的子类附附加 一一些职责责。实现:该该 模式式的实现现主要就就是定义义一个物物理上的的新的子子类,但但是,它它只是包包含要附附加职责责的类,传传递外部
18、部对相同同接口的的调用,在在这个传传递调用用的通道道上附加加额外的的功能。突突然 想想到,DDecoorattor模模式是不不是一定定程度上上也能代代替DyynammicPProxxy模 式,从从而成为为一种AAOP实实现的方方案呢?重构成本本:低。定定义一个个Deccoraatorr和一个个已有类类的逻辑辑上的子子类,物物理 表表现形式式上都是是一个子子类,重重构也确确实不是是难事。2.5 Faccadee思想:为为子系统统中的一一组接口口提供一一个一致致的界面面,这个个接口使使得这一一子系统统更加容容易使用用。场景:当当 你要要为一个个复杂子子系统提提供一个个简单接接口时。子子系统往往往因
19、为为不断演演化而变变得越来来越复杂杂。大多多数模式式使用时时都会产产生更多多更小的的类。这这使得子子系统更更具可重重用性, 也更容容易对子子系统进进行定制制,但这这也给那那些不需需要定制制子系统统的用户户带来一一些使用用上的困困难。FFacaade可可 以提提供一个个简单的的缺省视视图,这这一视图图对大多多数用户户来说已已经足够够,而那那些需要要更多的的可定制制性的用用户可以以越过FFacaade层层。 客客户程序序与抽象象类的实实现部分分之间存存在着很很大的依依赖性。引引入Faacadde将这这个子系系统与客客户以及及其他 的子系系统分离离,可以以提高子子系统的的独立性性和可移移植性。当当你
20、需要要构建一一个层次次结构的的子系统统时,使使用Faacadde模 式定义义子系统统中每层层的入口口点。如如果子系系统之间间是相互互依赖的的,你可可以让它它们仅通通过Faacadde进行行通 讯讯,从而而简化了了它们之之间的依依赖关系系。(这这里直接接引用了了设计计模式迷迷你手册册,因因为觉得得它确实实已经说说得很明明了了,下下面类似似的情形形我直接接引用原原文的就就不再注注明 了了,这里里先说明明一下,感感谢手手册作作者的这这些优秀秀总结。当当然,本本文的绝绝大多数数文字都都是Teeddyy本 人人的原创创看法,绝绝非抄袭袭,您可可以比较较本文和和附件手手册,附附件同时时也会提提供本文文的W
21、oord版版本下 载。)实现:该该 模式式的实现现需要定定义一个个新的系系统构架架上的LLayeer,该该层向上上提供一一组新的的接口,向向下调用用子系统统原 有有的接口口。重构成本本:高。要要修改所所有直接接对子系系统的地地调用为为对Faaadde层的的调用还还是 有有很多事事情要做做的。不不过,现现代IDDE中,如如果我们们删除调调用层对对子系统统的程序序集引用用,那么么所有这这些我 们需要要修改的的调用都都能标示示出来,因因为编译译不能通通过了嘛嘛,因此此,重构构的风险险还不算算特别大大,只是是工作量量着实不不小。2.6FFlywweigght思想:说说Flyyweiightt可 能能有
22、的朋朋友第一一次看到到想象不不到是什什么样子子,其实实说他就就是一个个Poool,你你可能就就明白了了。也就就是由一一 个FFlywweigght Facctorry来管管理一族族一定数数目逻辑辑上经常常需要构构建和销销毁的细细颗粒对对象, 例如我我们常见见的数据据库连接接池。在在Facctorry内部部,并不不物理销销毁这些些对象,而而在接到到实例化化请求时时 返回回这些被被关系对对象的实实例,从从而减少少创建销销毁这些些细颗粒粒对象的的开销。场景:基基 本上上所有的的需要PPooll这个概概念的环环境都能能应用。实现:实实现的底底层方式式可以千千变万化化,在接接口上就就是如上上图所示示,花
23、样样不多。这这里就不不多解释释。重构成本本:低。2.7 Prooxy思想:前前 面在在Deccoraatorr模式中中也提到到了Prroxyy模 式式了。它它是通过过逻辑上上继承一一个已有有类的子子类,从从而扩展展原有的的子类的的功能。场景:需需 要注注意体会会他和DDecoorattor的的需别。PProxxy是 继承需需要修饰饰的类,而而Deccoraatorr用的是是包含的的方式。PProxxy模 式,或或者准确确地说DDynaamiccProoxy模模式,是是现代AAOP框框 架实实现中的的一种常常用方式式。典型型的实现现如Spprinng,JJBosss以 及Caastlle PPr
24、ojjectt中的AAspeect#。实现:继继承,并并在过载载方法中中添加需需要的修修饰功能能。重构成本本:低。3 行为为型3.1 Intterppretter思想:当当 有一一个语言言需要解解释执行行, 并并且你可可将该语语言中的的句子表表示为一一个抽象象语法树树时,定定义一个个解释器器,这 个解释释器使用用该表示示来解释释语言中中的句子子。场景:其其 实,从从物理结结构上,该该模式的的代码架架构看起起来可能能和Coompoositte模式式一模一一样,致致使其针针对的逻逻 辑语语义不同同。Coompoositte模式式描述一一种一般般的整体体和部分分使用接接口上的的一致性性,而IInte
25、erprreteer模 式则侧侧重于语语言解释释器的实实现构架架。实现:如如 上图图,基本本同Coompoositte模式式。重构成本本:高。3.2IIterratoor思想:提提 供一一种方法法顺序访访问一个个聚合对对象中各各个元素素, 而而又不需需暴露该该对象的的内部表表示。场景:访访 问一一个聚合合对象的的内容而而无需暴暴露它的的内部表表示。支支持对聚聚合对象象的多种种遍历。为为遍历不不同的聚聚合结构构提供一一个统一一的接口口(即, 支持持多态迭迭代)。实现:其其 实就就是定义义一个逻逻辑上类类似一个个指针的的迭代类类。专门门用于这这种迭代代工作。如如果对CC+ STLL火锅功功夫 学学
26、习的朋朋友一定定不会陌陌生啦。实实际使用用过一下下就明白白了。除除了功能能之外,他他给我最最大的感感受就是是他让我我熟悉的的forr(innt ii = 0; i liist.Couunt; i+)语语句,变变长了好好多。-重构成本本:中。3.3MMediiatoor思想:用用一个中中介对象象来封装装一系列列的对象象交互。中中介者使使各对象象不需要要显式地地相互引引用,从从而使其其耦合松松散,而而且可以以独立地地改变它它们之间间的交互互。场景:该该模式主主要用来来进行降降低一组组相互关关联调用用的对象象间的耦耦合度。如如果您发发现您的的系统的的某部分分的一组组对象间间调用极极其频繁繁的坏味味道
27、的话话,可能能您 需需要考虑虑使用该该模式来来进行一一些解耦耦,否则则,这些些对象中中的任何何一个的的修改,都都将可能能导致其其他对象象许多地地方的修修改,可可维护性性就降低低了。实现:定定义一个个专门的的中介对对象来封封装和传传递一组组对象间间的调用用。重构成本本:中。3.4MMemeentoo思想:用用在不破破坏封装装性的前前提下,捕捕获一个个对象的的内部状状态,并并在该对对象之外外保存这这个状态态。这样样以后就就可将该该对象恢恢复到原原先保存存的状态态。场景:该该 模式式主要用用来实现现类似我我们在常常见的编编辑器中中经常执执行的UUndoo(Cttrl+Z) 操作。实实际上就就是在外外
28、部保持持一组对对象的某某一时刻刻的状态态,并在在需要的的另一个个时候将将这组对对象回复复到之前前的状态态。实现:该该 模式式其实主主要是一一种对象象状态的的暂存和和回复的的思想。上上面的UUML图图是一种种比较典典型的实实现方式式定定一 个个专门用用于保存存类状态态的类,为为被保存存状态的的类定义义返回当当前状态态类实例例,和根根据状态态类实例例回复对对象状态态的接口口。实际际上也不不必太拘拘泥于这这个实现现,简单单情形下下, 我我们完全全可以利利用任何何的已有有的对象象持久化化或者序序列化机机制来用用一个字字符串暂暂存对象象的当前前完整状状态。重构成本本:低。3.5 Temmplaate M
29、etthodd思想:定定 义一一个操作作中的算算法的骨骨架,而而将一些些步骤延延迟到子子类中。TTe mm p l aa t e MM e t hh o d 使使 得子子类可以以不改变变一个算算法的结结构即可可重定义义该算法法的某些些特定步步骤。场景:该该 模式式实际上上是一种种非常直直观和可可理解的的OO思思想下的的代码重重用的实实现。只只需一次次性实现现一个算算法的不不变的 部分,并并将可变变的行为为留给子子类来实实现。各各子类中中公共的的行为应应被提取取出来并并集中到到一个公公共父类类中以避避免代码码重复。模模板方法法只允许许在特定定点计算算法的某某个阶段段被 过过载,这这样也就就只允许
30、许在这些些点进行行扩展。实现:见见上图,太太简单了了,就不不多说了了。重构成本本:低。3.6 Chaain of Ressponnsibbiliity思想:使使多个对对象都有有机会处处理请求求,从而而避免请请求的发发送者和和接收者者之间的的耦合关关系。将将这些对对象连成成一条链链,并沿沿着这条条链传递递该请求求,直到到有一 个对象象处理它它为止。场景:该该模式实实际上是是对人们们常会不不自觉地地去做的的一种代代码组织织方式的的总结而而已。有有的时候候一条消消息需要要被处理理,我们们当然可可以在一一个雷的的一个方方法中 对他进进行所有有需要的的处理。但但是,如如果要做做的处理理很复杂杂的情形形,
31、甚至至能够按按照一定定的逻辑辑醒来分分类所有有这些处处理,则则不要在在一个雷雷一个函函数里处处以一切切会更好好,我 们可以以定义多多个处理理类类表表示逻辑辑上的不不同的处处理,然然后一个个个处理理类的传传递这个个消息对对象,让让希望处处理该消消息的类类自己决决定是不不是要处处理。这这样,就就能将一一个难以以 维护护的复杂杂处理过过程,分分解为一一系列简简单明了了,易于于维护的的类了。实现:上上图是实实现方式式之一。即即,使所所有可能能处理该该请求的的对象继继承自一一个基类类,实际际上,只只要逻辑辑语义上上我们保保持这样样一种让让每个处处理类自自己决定定何 时时处理,并并传递请请求的思思想,实实
32、现方式式也可以以千变万万化,无无论是用用接口代代替,或或者甚至至只是简简单的定定义相同同结构的的处理函函数而通通过反射射机制来来调用处处理函数数和传递递处 理理请求,都都是可选选的方案案。重构成本本:中。3.7CCommmandd思想:将将一个动动态的执执行过程程封装成成一个对对象,可可以像处处理数据据来处理理和管理理这样的的对象,在在需要的的时候激激发该对对象的方方法就能能执行被被封装的的执行过过 程。场景:该该模式在在很多时时候非常常有用,它它使得我我们对逻逻辑上已已经激发发的行为为进行优优化成为为可能,我我们不仅仅可以根根据需要要改变一一组逻辑辑上以经经济法的的活动的的 顺序序,消冗冗余
33、操作作,撤销销不必要要的操作作等。也也可以把把活动和和操作视视为资源源一样来来管理和和重用。同同时该模模式也是是许多事事务处理理机制的的基础。实现:实实现很简简单,只只是定义义一些能能够通过过指定接接口被激激发的对对活动进进行封装装的类,然然后我们们按照需需要管理理这些类类,并在在需要的的时候激激发这些些活动。您您 还是是应该更更多地去去体会,为为什么他他是事务务处理机机制的基基础,当当我们可可以这样样来管理理一组活活动的时时候,可可以对这这些活动动进行那那些有趣趣的控制制。重构成本本:高。3.8OObseerveer思想:定定 义对对象间的的一种一一对多的的依赖关关系,当当一个对对象的状状态
34、发生生改变时时, 所所 有依依赖于它它的对象象都得到到通知并并被自动动更新。场景:上上面描述述该模式式思想的的文字可可能显得得有些拗拗口,实实际上你你也不用用想得过过于复杂杂。只要要你写过过任何的的基于图图形界面面的程序序,那么么实际上上您对他他是一 点也不不该陌生生的。它它就是我我们每一一次鼠标标键盘敲敲击都在在我们的的程序内内部流转转着的事事件机制制的基础础。当一一个事件件发生,则则通知订订阅该事事件的对对象。实现:上上 面的的UMLL图看似似复杂,实实际上,去去理解它它的最好好的办法法就是试试着思考考和使用用任何一一种OOO语 言言来定义义一个拥拥有事件件机制的的类。比比如,.Nett下
35、,你你只要好好好去看看看关于于dellegaate的的 文档档,尝试试着根据据MSDDN写写写看一个个最简单单的自定定义事件件。那么么,上面面的UMML图, 我敢保保证你能能很轻易易的看明明白。重构成本本:高。3.9 Staate思想:允允许一个个对象在在其内部部状态改改变时改改变它的的行为。场景:实实 际上上该模式式在作为为重构的的目的是是,绝大大多数情情况我们们做的事事情是将将对一个个类的sstatte进行行if-elsse或 者seelecct-ccasee,决定定该执行行什么操操作的过过程解耦耦的过程程。实现:将将 表述述一个类类的某些些操作该该做什么么,该怎怎么做的的信息保保存到其其
36、staate中中。即用用一个包包含更多多信息,甚甚至 执执行逻辑辑的sttatee类实例例来代替替一个简简单数据据类型的的staate属属 性。重构成本本:中。3.100Strrateegy思想:定定 义一一系列的的算法,把它们们一个个个封装起起来, 并 且且使它们们可相互互替换。本本模式使使得算法法可独立立于使用用它的客客户而变变化。场景:该该 模式式实际上上也可以以理解为为一种BBriddge模模式的变变种。只只是它突突出的是是,一般般当我们们把一个个类或者者一组 类的一一些代码码独立成成一个SStraateggy类的的时候,我我们可能能会为同同样接口口的这些些算法定定义多个个接口一一 致
37、,但但是实现现方法不不同的版版本,并并在需要要的时候候灵活的的替换这这些算法法。实现:实实 现方方式同BBriddge模模式。重构成本本:中。3.111Vissitoor思想:表表 示一一个作用用于某对对象结构构中的各各元素的的操作。它它使你可可以在不不改变各各元素的的类的前前提下定定义作用用于这些些元素的的新操作作。场景:其其 实你你不用去去理解上上面这句句话。该该模式其其实又是是一个在在代码的的物理结结构上和和Briidgee模式很很相似的的模 式式。但是是,其语语义,其其目的,在在逻辑上上又是不不同的。如如果说BBriddge,以以及上述述我称为为可视为为Briidgee扩 展展的模式式
38、中,作作为参数数的Brridgge类,是是作为调调用类的的被访问问对象的的话,VVisiitorr, 在在大多数数情形下下,如其其英文含含义,它它在语义义上是完完全相反反的。不不是他被被调用的的类处理理,更大大程度上上它处于于主动状状态,是是它去访访问,去去处理调调用它的的类。调调用它的的类, 把自己己对别人人隐藏起起来的东东西,暴暴露给VVisiitorr品尝,任任君蹂躏躏(这个个,这个个千千 万别别想歪了了;-)。另另一方面面,即使使逻辑上上没有这这种Viisittor主主 动去去访问调调用类的的语义,只只要Viisittor类类中的操操作,是是依赖于于调用类类的具体体实现类类(它本本身或他他某 个个层次的的子类)的的某些状状态或者者方法的的,那么么,就可可以应用用该模式式来分离离出这样样的可重重用的操操作。实现:类类 似BBriddge模模式。重重构成本本:中。