资源预览内容
第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
第9页 / 共13页
第10页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
GRASPP(Genneraal RRespponssibiilitty AAssiignmmentt Sooftwwaree Paatteernss)创建者(CCreaatorr)问题:谁创创建了AA?解决方案:如果以以下条件件之一为为真时(越越多越好好),将将创建类类A实例例的职责责分配给给B:l B“包含”或组成成聚合了了Al B记录Al B紧密地使使用Al B具有A的的初始化化数据举例:比如在富客客户端应应用开发发中,主主程序创创建一个个主窗口口对象,然然后有主主窗口对对象来负负责创建建它内部部的各种种菜单、按按钮等对对象(而而不是由由主程序序来创建建这些菜菜单或按按钮对象象之后,再再把它设设置到主主窗口中中去)信息专家(Infformmatiion Exppertt)问题:给对对象分配配职责的的基本原原则是什什么?解决方案:把职责责分配给给具有完完成该职职责所需需信息的的那个类类。(描描述一种种直觉!)举例:publiic cclasss CClasssess privvatee innt iid;privvatee Seet sstuddentts;/描述述一种直直觉publlic voiid aaddSStuddentt(Sttudeent stuudennt)if(stuudennts = nulll)sttudeentss = neww HaashSSet();stuudennts.addd(sttudeent);/将职职责放在在拥有这这个职责责所需信信息的那那个类中中publlic boooleaan hhasSStuddentt(Sttudeent stuudennt)forr (IIterratoor iiterratoor = sttudeentss.itteraatorr(); itteraatorr.haasNeext();) Sttudeent s = (SStuddentt) iiterratoor.nnextt();iff(s.equualss(sttudeent)rretuurn truue;retturnn faalsee;publiic cclasss SStuddentt privvatee innt iid;privvatee Sttrinng nnamee;/判断断两个学学生对象象是否相相同的职职责,交交给Sttudeent来来完成,因因为它拥拥有这个个/职责责所需要要的所有有信息publlic boooleaan eequaals(Stuudennt sstuddentt) if(namme.eequaals(stuudennt.ggetNNamee()reeturrn ttruee;retturnn faalsee;publiic cclasss TTreeeNodde privvatee innt iid;privvatee innt lleveel;privvatee Sttrinng nnodeeNamme;privvatee TrreeNNodee paarennt;privvatee Liist chhilddrenn;publlic voiid pprinnt()forr(innt ii=0; ilevvel; i+)Syysteem.oout.priint(-);Sysstemm.ouut.pprinntlnn(noodeNNamee);forr (IIterratoor iteerattor = cchilldreen.iiterratoor(); iiterratoor.hhasNNextt();) TrreeNNodee noode = iteerattor.nexxt();noode.priint();低耦合(LLow Couupliing)所谓耦合,即即两个对对象之间间联系的的紧密程程度问题:如何何减少因因变化产产生的影影响?解决方案:分配职职责以使使耦合保保持在较较低的水水平。低耦合是构构建软件件最重要要的目标标之一。要注意:我我们讲低低耦合,是是降低与与不稳定定系统之之间的耦耦合度,而而不是那那些稳定定的系统统,比如如说我们们在JAAVA编编程过程程中,没没有必要要想专门门的办法法来降低低与JDDK核心心类库之之间的耦耦合度,因因为JDDK核心心类库非非常稳定定,很少少会发生生变化。高内聚(HHighh Coohessionn)所谓内聚,即即对象职职责的相相关性(或或对象的的操作之之间联系系的紧密密程度)。高内聚,即保持对象职责的高度相关性。不良内聚和不良耦合往往都是齐头并进的!问题:怎样样保持对对象是有有重点的的、可理理解的、可可管理的的,并且且能够支支持低耦耦合?解决方案:分配职职责以保保持较高高的内聚聚性。内聚性较低低的类,要要做许多多不相关关的工作作,或需需要完成成大量的的工作。这这样的类类是不合合理的。这这样的类类会有下下列问题题:l 难以理解l 难以复用l 难以维护l 脆弱,经常常会受到到变化的的影响高内聚、低低耦合是是我们进进行系统统设计时时,应该该尽量要要达到的的目标。但是在某些情况下,这些原则也许不太合适。比如在分布式系统的开发中。分布式系统开发中的分布式对象之间的互相调用,可能会跨越网络,跨网络调用会导致系统性能的下降,为了提高性能,所以必须寻找某种手段来降低跨网络调用的次数。控制器(CConttrolllerr)问题:在UUI层下下首先接接收和协协调(“控制”)系统统操作的的对象是是什么?解决方案:把职责责分配给给能代表表下列选选择之一一的对象象:l 代表整个“系统”、“根对象象”(外观观控制器器)。 - 一般用用Faadee模式来来实现l 代表发生系系统操作作的用例例场景(用用例控制制器)。 - 如果使使用Faaadde来实实现一个个外观控控制器,会使得这个控制器非常臃肿,那么可以考虑采用用例控制器。举例:比如说,“导入组组织机构构的数据据”用例,要要求能够够在界面面上上传传两个EExceel文件件,一个个Exccel是是部门信信息,一一个Exxcell是人员员信息。那么在实现这个用例的时候,UI层在接收到数据之后,应该将业务逻辑统一交给一个业务逻辑处理对象来完成。很显然,这个业务逻辑对象,需要调度Excel处理相关的对象、人员信息处理相关的对象、部门信息处理相关的对象等来完成这个导入数据的业务。此业务逻辑对象就是用例控制器。要注意:MMVC中中的C,并并不是我我们这里里的控制制器。因因为MVVC中的的C处于于UI层层,而不不是业务务逻辑层层。多态(Poolymmorpphissm)问题:如何何处理基基于类型型的选择择?如何何创建可可插拔的的软件构构件?解决方案:当相关关选择或或行为随随类型(类类)有所所不同时时,使用用多态操操作为变变化的行行为类型型分配职职责。不要测试对对象的类类型,也也不要使使用条件件逻辑来来执行基基于类型型的不同同选择。纯虚构(PPuree Faabriicattionn)问题:当你你并不想想违背高高内聚和和低耦合合或其它它目标,但但是基于于专家模模式所提提供的方方案又不不合适时时,哪些些对象应应该承担担这一职职责?(很很多情况况下,只只对领域域对象分分配职责责会导致致不良内内聚或耦耦合,或或者降低低复用潜潜力)解决方案:对人为制造造的类分分配一组组高内聚聚的职责责,该类类并不代代表问题题领域的的概念虚构构的事物物,用以以支持高高内聚,低低耦合和和复用。所有GOFF设计模模式(或或其它模模式)都都是纯虚虚构。间接性(IIndiirecctioon)问题:为了了避免两两个或多多个事物物之间的的直接耦耦合,应应该如何何分配职职责?如如何使对对象解耦耦合,以以支持低低耦合并并提供复复用性潜潜力?解决方案:将职责责分配给给中介对对象,避避免它们们之间的的直接耦耦合。中中介实现现了间接接性。大量GOFF模式,如如适配器器、外观观等等都都是间接接性的体体现。防止变异(PProttectted Varriattionn)问题:如何何设计对对象、子子系统和和系统,使使其内部部的变化化或不稳稳定性不不会对其其它元素素产生不不良影响响?解决方案:识别预预计变化化或不稳稳定之处处,分配配职责用用以在这这些变化化之外创创建稳定定接口。几乎所有的的软件或或架构设设计技巧巧,都是是防止变变异的特特例,比比如封装装、多态态、接口口、虚拟拟机、配配置文件件等等等等等!OOD原则则单一职责原原则(SSRP)就一个类而而言,应应该仅有有一个引引起它变变化的原原因。开放-封闭闭原则(OOCP)软件实体(类类、模块块、函数数等等)应应该是可可以扩展展的,但但是不可可修改的的。1、 对于扩展是是开放的的这意味着模模块的行行为是可可以扩展展的。当当应用的的需求改改变时,我我们可以以对模块块进行扩扩展,使使其具有有满足那那些改变变的新行行为。2、 对于更改是是封闭的的对模块的行行为进行行扩展时时,不必必改动模模块的源源代码或或者二进进制代码码。OCP背后后的主要要机制是是抽象与多多态!Liskoov替换换原则(LLSP)子类型必须须能够替替换掉它它们的基基类型。简单的例子子:违反LSPP原则的的例子publlic voiid ssayssomeethiing(Lannguaage lann)Strringg teempSStr = ;if(lann innstaanceeof Chiinesse)teempSStr = 中文;if(lann innstaanceeof Enngliish)teempSStr = 英文文;Sysstemm.ouut.pprinntlnn(现现在你学学习的语语言是:+ttemppStrr);因为如果传传递到ssayssomeethiing方方法中的的Lannguaage是是一个JJapaanesse对象象时,它它将无法法处理!要让它符合合LSPP也非常常简单:publiic absstraact claass Lannguaage publlic absstraact Strringg tooStrringg();publiic claass Chiinesse eexteendss LaanguuageeOveerriidepubllic Strringg tooStrringg() retturnn 中文文;publiic claass Engglissh eexteendss Lannguaa
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号