设计模式简要论述_第1页
设计模式简要论述_第2页
设计模式简要论述_第3页
设计模式简要论述_第4页
设计模式简要论述_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、GRASSP(Genneraal RRespponssibiilitty AAssiignmmentt Sooftwwaree Paatteernss)创建者(Creeatoor)问题:谁谁创建了了A?解决方案案:如果果以下条条件之一一为真时时(越多多越好),将创创建类AA实例的的职责分分配给BB:B“包含含”或组成成聚合了了AB记录AAB紧密地地使用AAB具有AA的初始始化数据据举例:比如在富富客户端端应用开开发中,主程序序创建一一个主窗窗口对象象,然后后有主窗窗口对象象来负责责创建它它内部的的各种菜菜单、按按钮等对对象(而而不是由由主程序序来创建建这些菜菜单或按按钮对象象之后,再把它它设置

2、到到主窗口口中去)信息专家家(Innforrmattionn Exxperrt)问题:给给对象分分配职责责的基本本原则是是什么?解决方案案:把职职责分配配给具有有完成该该职责所所需信息息的那个个类。(描述一一种直觉觉!)举例:publlic claass Claassees priivatte iint id;priivatte SSet stuudennts;/描描述一种种直觉publlic voiid aaddSStuddentt(Sttudeent stuudennt)iff(sttudeentss = nuull)sstuddentts = neew HHashhSett();sttu

3、deentss.addd(sstuddentt);/将将职责放放在拥有有这个职职责所需需信息的的那个类类中publlic boooleaan hhasSStuddentt(Sttudeent stuudennt)foor (Iteerattor iteerattor = sstuddentts.iiterratoor(); iiterratoor.hhasNNextt();) SStuddentt s = (Stuudennt) iteerattor.nexxt();iif(ss.eqqualls(sstuddentt)retturnn trrue;reeturrn ffalsse;publl

4、ic claass Stuudennt priivatte iint id;priivatte SStriing namme;/判判断两个个学生对对象是否否相同的的职责,交给SStuddentt来完成成,因为为它拥有有这个/职职责所需需要的所所有信息息publlic boooleaan eequaals(Stuudennt sstuddentt) iff(naame.equualss(sttudeent.gettNamme()rretuurn truue;reeturrn ffalsse;publlic claass TreeeNoode priivatte iint id;priivatte

5、 iint levvel;priivatte SStriing noddeNaame;priivatte TTreeeNodde ppareent;priivatte LListt cchilldreen;publlic voiid pprinnt()foor(iint i=00; iileevell; ii+)Systtem.outt.prrintt(-);Syysteem.oout.priintlln(nnodeeNamme);for (Itteraatorr iiterratoor = chhilddrenn.itteraatorr(); itteraatorr.haasNeext();

6、) TTreeeNodde nnodee = itteraatorr.neext();nnodee.prrintt();低耦合(Loww Cooupllingg)所谓耦合合,即两两个对象象之间联联系的紧紧密程度度问题:如如何减少少因变化化产生的的影响?解决方案案:分配配职责以以使耦合合保持在在较低的的水平。低耦合是是构建软软件最重重要的目目标之一一。要注意:我们讲讲低耦合合,是降降低与不不稳定系系统之间间的耦合合度,而而不是那那些稳定定的系统统,比如如说我们们在JAAVA编编程过程程中,没没有必要要想专门门的办法法来降低低与JDDK核心心类库之之间的耦耦合度,因为JJDK核核心类库库非常稳稳定

7、,很很少会发发生变化化。高内聚(Higgh CCoheesioon)所谓内聚聚,即对对象职责责的相关关性(或或对象的的操作之之间联系系的紧密密程度)。高内内聚,即即保持对对象职责责的高度度相关性性。不良良内聚和和不良耦耦合往往往都是齐齐头并进进的!问题:怎怎样保持持对象是是有重点点的、可可理解的的、可管管理的,并且能能够支持持低耦合合?解决方案案:分配配职责以以保持较较高的内内聚性。内聚性较较低的类类,要做做许多不不相关的的工作,或需要要完成大大量的工工作。这这样的类类是不合合理的。这样的的类会有有下列问问题:难以理解解难以复用用难以维护护脆弱,经经常会受受到变化化的影响响高内聚、低耦合合是我

8、们们进行系系统设计计时,应应该尽量量要达到到的目标标。但是是在某些些情况下下,这些些原则也也许不太太合适。比如在在分布式式系统的的开发中中。分布布式系统统开发中中的分布布式对象象之间的的互相调调用,可可能会跨跨越网络络,跨网网络调用用会导致致系统性性能的下下降,为为了提高高性能,所以必必须寻找找某种手手段来降降低跨网网络调用用的次数数。控制器(Conntroolleer)问题:在在UI层层下首先先接收和和协调(“控制”)系统统操作的的对象是是什么?解决方案案:把职职责分配配给能代代表下列列选择之之一的对对象:代表整个个“系统”、“根对象象”(外观观控制器器)。 - 一般用用Faadee模式来来

9、实现代表发生生系统操操作的用用例场景景(用例例控制器器)。 - 如果使使用Faaadde来实实现一个个外观控控制器,会使得得这个控控制器非非常臃肿肿,那么么可以考考虑采用用用例控控制器。举例:比如说,“导入组组织机构构的数据据”用例,要要求能够够在界面面上上传传两个EExceel文件件,一个个Exccel是是部门信信息,一一个Exxcell是人员员信息。那么在在实现这这个用例例的时候候,UII层在接接收到数数据之后后,应该该将业务务逻辑统统一交给给一个业业务逻辑辑处理对对象来完完成。很很显然,这个业业务逻辑辑对象,需要调调度Exxcell处理相相关的对对象、人人员信息息处理相相关的对对象、部部

10、门信息息处理相相关的对对象等来来完成这这个导入入数据的的业务。此业务务逻辑对对象就是是用例控控制器。要注意:MVCC中的CC,并不不是我们们这里的的控制器器。因为为MVCC中的CC处于UUI层,而不是是业务逻逻辑层。多态(PPolyymorrphiism)问题:如如何处理理基于类类型的选选择?如如何创建建可插拔拔的软件件构件?解决方案案:当相相关选择择或行为为随类型型(类)有所不不同时,使用多多态操作作为变化化的行为为类型分分配职责责。不要测试试对象的的类型,也不要要使用条条件逻辑辑来执行行基于类类型的不不同选择择。纯虚构(Purre FFabrricaatioon)问题:当当你并不不想违背背

11、高内聚聚和低耦耦合或其其它目标标,但是是基于专专家模式式所提供供的方案案又不合合适时,哪些对对象应该该承担这这一职责责?(很很多情况况下,只只对领域域对象分分配职责责会导致致不良内内聚或耦耦合,或或者降低低复用潜潜力)解决方案案:对人为制制造的类类分配一一组高内内聚的职职责,该该类并不不代表问问题领域域的概念念虚构构的事物物,用以以支持高高内聚,低耦合合和复用用。所有GOOF设计计模式(或其它它模式)都是纯纯虚构。间接性(Inddireectiion)问题:为为了避免免两个或或多个事事物之间间的直接接耦合,应该如如何分配配职责?如何使使对象解解耦合,以支持持低耦合合并提供供复用性性潜力?解决方

12、案案:将职职责分配配给中介介对象,避免它它们之间间的直接接耦合。中介实实现了间间接性。大量GOOF模式式,如适适配器、外观等等等都是是间接性性的体现现。防止变异异(Prroteecteed VVariiatiion)问题:如如何设计计对象、子系统统和系统统,使其其内部的的变化或或不稳定定性不会会对其它它元素产产生不良良影响?解决方案案:识别别预计变变化或不不稳定之之处,分分配职责责用以在在这些变变化之外外创建稳稳定接口口。几乎所有有的软件件或架构构设计技技巧,都都是防止止变异的的特例,比如封封装、多多态、接接口、虚虚拟机、配置文文件等等等等等!OOD原原则单一职责责原则(SRPP)就一个类类而

13、言,应该仅仅有一个个引起它它变化的的原因。开放-封封闭原则则(OCCP)软件实体体(类、模块、函数等等等)应应该是可可以扩展展的,但但是不可可修改的的。对于扩展展是开放放的这意味着着模块的的行为是是可以扩扩展的。当应用用的需求求改变时时,我们们可以对对模块进进行扩展展,使其其具有满满足那些些改变的的新行为为。对于更改改是封闭闭的对模块的的行为进进行扩展展时,不不必改动动模块的的源代码码或者二二进制代代码。OCP背背后的主主要机制制是抽象象与多态态!Liskkov替替换原则则(LSSP)子类型必必须能够够替换掉掉它们的的基类型型。简单的例例子:违反LSSP原则则的例子子publlicvvoidd

14、 saaysoometthinng(LLangguagge llan)Sttrinng ttemppStrr = ;if(llan insstannceoof CChinnesee)ttemppStrr = 中文文;if(llan insstannceoof Enngliish)ttemppStrr =英文;Syysteem.oout.priintlln(现在你你学习的的语言是是:+temmpSttr);因为如果果传递到到sayysommethhingg方法中中的Laanguuagee是一个个Jappaneese对对象时,它将无无法处理理!要让它符符合LSSP也非非常简单单:publlicaa

15、bsttracctcllasss Laanguuagee publlicaabsttracct SStriing toSStriing();publliccclasss CChinnesee exteendss LaanguuageeOveerriidepubllic Strringg tooStrringg() retuurn中文;publliccclasss EEngllishh exxtenndsLLangguaggeOveerriidepubllic Strringg tooStrringg() retuurn英语;publlicvvoidd saaysoometthinng(LLangguagge llan)Syyst

温馨提示

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

评论

0/150

提交评论