




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
对象设计的主要任务:精化类的属性和操作明确类之间的关系整理和优化设计模型4.4对象设计第4章面向对象的设计1松惰剥碗比菲迪糠紊务峻鳞背瓜奖绿熄郑拥姨捞溉吐蹿初俩门扁仔晚胃埋面向对象的设计-面向对象的设计-对象设计的主要任务:4.4对象设计第4章面向1
4.4.1对类的属性的处理4.4.4应用设计模式定义操作4.4.2关联的设计4.4.3对结构的优化4.4.5检查系统设计2内容匀啮颅特搔塔舶忍卷畦临腕站棵搜族颗特白比蹬弊柜刚糟枉篱战僳织瘟垣面向对象的设计-面向对象的设计-4.4.1对类的属性的处理4.4.4应用设计模式定24.4.1对类的属性的处理(1)回顾属性的来源(2)成员细节的表示3(3)在哪里展示非简单数据类型和纯数据值?
(4)对属性的数量和单位建模(5)对属性的处理(6)外部键的属性咒颧琶疽平刘息舆驰郎湍酌惫甭忙税奥拢亭蹭捧疟窄札骚童癣粗偷被健毙面向对象的设计-面向对象的设计-4.4.1对类的属性的处理(1)回顾属性的来源(2)3(1)回顾属性的来源类所代表的现实实体的基本信息;描述状态的信息;派生属性(derivedattribute)如:类CourseOffering中的“学生数目”/numStudents:int描述该类与其他类之间关联的信息;其他常见的类型:
地址Address、颜色Color、几何元素Geometrics、电话号码PhoneNumber、通用商品代码UPC、社会安全代码SocialSecurityNumber、邮政编码PostalCode、枚举类型等。4收时嘱毗京普炮双瞒坏当桓闸尾城嚼释衔腊裕鹏申该轨限腊叙滔磺国德愈面向对象的设计-面向对象的设计-(1)回顾属性的来源类所代表的现实实体的基本信息;描述状态4具体说明属性的名称、类型、缺省值、可见性等;Public:‘+’;Private:‘-’;Protected:‘#’。(2)成员细节的表示基本原则尽可能将所有属性的可见性设置为private;仅通过set方法更新属性;仅通过get方法访问属性。图4-56有细节的类图5燃由硼豫漆羽翼刘茎倘接箭辊家半坑遥妻雇岭多钳倒眺苇占价定嘱份排辫面向对象的设计-面向对象的设计-(2)成员细节的表示基本原则图4-56有细节的类图5燃由5(3)在哪里展示非简单数据类型和纯数据值?
ProductSpecificationupc:UPCStoreAddress:AddressProductSpecificationUPC*1StoreAddress*1UPC是非简单数据类型(要对它进行验证,也可包括制造者属性),即有属性和关联,也可用概念来表示。UPC是纯数据值,在概念模型中当作属性看待。
图4-57用概念表示属性UPC是一个纯数据值,但也可以是一个非简单数据类型。6逸冈舞推踢三萎弛揽奖汲骗县棘闷以铱雾虹梅竿勘赐稠宏甭盒亨敞伟论跃面向对象的设计-面向对象的设计-(3)在哪里展示非简单数据类型和纯数据值?Product6(4)对属性的数量和单位建模Paymentamount:NumberPaymentQuantityamount:Number*1Paymentamount:Quantity数量是纯数据值,可作为属性这个表示可用,但不灵活或不可靠,要知道支付货款时所用的货币单位。
UnitHas-amountIs-in*1将数量作为一个单独概念图4-58对属性的数量和单位建模7熄瓷炕巨要诸心熬南毅狙幻博捅准钨屁骏巨窿滥陌剖毅彩庶纬只湘净撇擞面向对象的设计-面向对象的设计-(4)对属性的数量和单位建模PaymentPaymentQ7(5)对属性的处理保留派生属性,避免重复计算描述其他事物的规格说明Flight航班datanumbertimeAirport机场nameFlies-to*1Flight航班datatimeDescribed-by*1Airport机场nameFlightDescriptionnumber*1Describes-flights-to较好图4-59描述其他事物的规格说明较差
8悸钻闺鼠撒恨寨引放误药苟椅死浑硅娠议呼数忙似疽淀背掳砂源磋骤淳琼面向对象的设计-面向对象的设计-(5)对属性的处理保留派生属性,避免重复计算描述其他事8分析阶段的数据类型只能是简单的、原始的数据类型,并不表示如C++、Java、Smalltalk中的属性(数据成员、实例变量)
(分析中的类图是对问题的存在建立的分析模型,而不是软件实体的分析模型)。在软件构造和设计阶段,对象之间的关联通常是用指向其他复杂类型的属性来表示(但不是唯一的解决方案)。(6)外部键的属性9涌感拥芒辙蜀风陨赘冰轿染祁况惭猾湿鞠宁杉拎备除丧趋服矽榔条支兄秩面向对象的设计-面向对象的设计-分析阶段的数据类型只能是简单的、原始的数据类型,并不表示如C9在分析阶段的对象模型中,不是使用属性,而是使用关联来联系两个概念的。设计中的类图,使用外键实现对象间的联系。CashiernamePOSTnumberUses11图4-60不使用外部键的属性CashierNamecureentPOSTNumber使用外部键的属性与另一个对象发生联系
图4-61有外部键的属性10(6)外部键的属性菊藩壳札孺绵旅钢仿辑蓟句他羡敝麦腾佑嫌什暗竣骆绽似彝诡穿柑郎燃榨面向对象的设计-面向对象的设计-在分析阶段的对象模型中,不是使用属性,而是使用关联来联系两104.4.2关联(Association)的设计(1)四种连接(2)增加冗余关联,提供访问效率(3)对限定关联(qualifiedassociation)的考虑(4)增加关联的导航(navigability)(5)对关联类的设计11市蔼哗碳涕快鲤永津哗僵次蛰市增爷买宛模柠掳埋惟虾虞栏毕轮恳掇恋快面向对象的设计-面向对象的设计-4.4.2关联(Association)的设计(1)11(1)四种连接全局(global):某个对象可以在全局范围内直接被其他对象“引用”。
参数(Parameter):某个对象作为另一个对象的某个操作参数或者返回值。
局部(Local):某个对象在另一个对象的某个操作中充当临时变量。域(Field):某个对象作为另一个对象的数据成员(聚合/组合关系)。两个类间依赖关系12味应胁探昂斯畔敝晰朗氨捻渭羹扎硬纵秉虏渍摘涤短蛛距烦账重台灰奏咖面向对象的设计-面向对象的设计-(1)四种连接全局(global):某个对象可以在全局范围12对象的连接方式attach(Timer
observerobs)detach(Timer
observerobs)notify()Timertick()TimerobserverinplayPosition():Cpointtick()SpriteFlayfieldCpoint0..1Velocity
tick()move()MovablespriteStationarysprite观察者图4-62对象的连接方式13苑皆矗芯嚼缺晒田夷群泌谍堪慢因鸥陷忠胃恶血遭医宅欣膝全技绰跌骑挛面向对象的设计-面向对象的设计-对象的连接方式attach(TimerTimertick(13关联源对象关联指针属性关联对象指针next属性关联对象指针next被关联对象被关联对象节点用指针或引用方式实现关联:0..*图4-63单向关联的实现公司雇员雇员雇主公司雇员14盲恳椽岿藉赌蛊安匹弟结交吻捌围傣仔蓑沁稍酚攘顺嘛糊泥且旗酞吴除饭面向对象的设计-面向对象的设计-关联源对象关联指针属性关联对象指针next属性关联对象指针14用java实现关联:
保险公司保险合同10..*有涉及PublicclassInsurance-Company{/*方法*/PrivateInsurance-ContractVectorContracts}PublicclassInsurance-Contract{/*方法*/PrivateInsurance-Companyrefer-to;}链属性的实现——依赖于关联的阶数15忻傀汲弛歌僚躺穿沽兑餐蛇睫狼撤件扇有赠雄翰佯树青功檀束揽啼兽相狞面向对象的设计-面向对象的设计-用java实现关联:保险公司保险合同10..*有涉及Pub15(2)增加冗余关联,提供访问效率**公司Find-skill雇员技能图4-64增加类16公司雇员娱剐圣捐芯一佑吏累纷捆揍段险窑烈才刹榔嗽栽曳绣挠镍塌澡杨舷奖红予面向对象的设计-面向对象的设计-(2)增加冗余关联,提供访问效率**公司雇员技能图4-616(3)对限定关联(qualifiedassociation)的考虑主要是减少限定符远端处的多重性,从多个减少到1个。分析类图中的限定符只是区分两种不同类型的事物。回忆17在设计类图中,关联的限定符是用某种键值或者记号实现的,而不是用Java的引用实现的。课候搂匙猪悯饼式角筛梧褂淌号铀确台掂珐技期弓芝其痢纷箔讳瑰担秀搜面向对象的设计-面向对象的设计-(3)对限定关联(qualifiedassociatio17图4-65关联的限定符Employee
LoginServeletempidpublicclassLoginServelet{privateStringempid;publicStringgetName(){Employeee=DB.getEmp(empid);returne.getName();}}18(3)对限定关联(qualifiedassociation)的考虑剂哄做逐柴稽碍雄涪从伸衙传黑化练帖殉懂酞妙增札恨早惨伯右孽若搪砌面向对象的设计-面向对象的设计-图4-65关联的限定符EmployeeLoginemp18在设计类图中,导航是角色的一个特性,它说明从源对象到目标对象沿着关联有一个单向的链接。(4)增加关联的导航(navigability)导航箭头的关联表示从源类到目标类的属性可见性。在实现时,导航箭头用源类中所定义的一个属性来实现,这个属性引用了目标类的一个实例。19率渭刨芳耪后伸着虫钉农姐罢铣化炎笋慷都递忧湿室索谈扦耐撩搐糊旋芭面向对象的设计-面向对象的设计-在设计类图中,导航是角色的一个特性,它说明从源对象到目标对象19POSTSaledateisComplete:BooleantimeCaptures捕获11becomeComplete()makeLineItem()makePayment()total()endSale()enterItem()makePayment()图4-66对象模型和设计类图导航箭头说明对象被单向链接到Sale对象POST类可能有一个指向Sale对象的属性没有导航箭头说明从Sale到POST方向没有链接20题戈篱龟纫冬婪参因拢庆泊溃喘碍絮阑葵锦您半例季烛祖代凝绪叁九诗挝面向对象的设计-面向对象的设计-POSTSaledateCaptures捕获11201图4-67添加引用属性根据类图中的关联和导航关系可推导出一个类的引用属性ProductSpecificationdescription:Textprice:Quantityupc:UPCSalesLineitemquantity:Integersubtotal():Quantity*Described-bypublicclassSalesLineitem{publicSalesLineitem(ProductSpecificationspec,intqty);publicfloatsubtotal();privateintquantity;简单属性privateProductSpecificationprodSpec;引用属性}prodSpec用属性名作为角色名21谬狼抨磋燎让潞理访啤列彬栓邪索勃苍徽渔幢搪蹲愚淤汞阀恢育照掏著惭面向对象的设计-面向对象的设计-1图4-67添加引用属性根据类图中的关联和导航关系可推导出21分析中的关联,是增进对问题的理解为目的(不是对数据流、实例变量连接等所做的一条声明)。说明:设计类图中的关联,是对软件构件的描述。设计类图中关联的选择要依据交互图中的可见性,和存储特性。从A到B导航关联的确定:
#A向B发送一个消息#A创建了B的一个实例#A需要维持到B之间的一个链接根据协作图来确定导航。在程序语言中,实现关联最普通的方法是使用一个指向关联类的属性。
22液辞颁酒屿榨液范妒他凭煌秦芝刃淋岗截控捧唐抿查涵弟怔玲佑洲星谓夏面向对象的设计-面向对象的设计-分析中的关联,是增进对问题的理解为目的(不是对数据流、实22在类图中,依赖关系描绘类之间的非属性的可见性时很有用,即描述参数、全局、局部可见性时很有用。普通的属性可见性是用关联线和导航箭头来表示的。非属性可见性的依赖关系23炯逊兆颜雨汞猩宽巾札俏酚挽孺苇登全藐铡冈忻厕铃逃骸铲侩恤唇默蜘翔面向对象的设计-面向对象的设计-在类图中,依赖关系描绘类之间的非属性的可见性时很有用,即描述23
图4-68非属性可见性的依赖关系POSTendSale()enterItem()makePayment()SalesLineitemquantity:Integersubtotal()Saledate:DateisComplete:Booleantime:TimebecomeComplete()makeLineItem()makePayment()Total()address:Addressname:TextaddSale()
StorePaymentamount:Quantity
ProductCatalogspecification()ProductSpecificationdescription:Textprice:Quantityupc:UPCHouses11Uses11Looks-in111..*1ContainsCaptures1111..*Contains1Describes*11Paid-by*1Loge-completed124娠陪折依让反劣场敞描渤邦稼塑猫倾萍摆贰容靛剑蓉轮秆斌趣颂秀靠辗岩面向对象的设计-面向对象的设计-图4-68非属性可见性的依赖关系POS24(5)对关联类的设计Supplier供应者Buyer买家Trade交易CompanyPersonjob***1..*关联类的例子:25源类包含了一个对关联类的引用,而关联类又包含了对目标类的引用。坦汰药饵疽半咯营补捣绑可绿嚼怒祸谤沪琼磅僧驱郑庞彻计忠骂壹势晤恋面向对象的设计-面向对象的设计-(5)对关联类的设计SupplierBuyerTradeC25上述设计有两点不足:#
找出对应一宗交易的都要花费一定的力气。#违反了对象封装的原则,与交易相关的数据(供应和买
家)没放在交易对象中。Suppliercompany-name:Stringaddress:Stringbuyers:Buyer[*]trades:Trades[*]Buyername:Stringaddress:Stringsupplier:Supplier[*]trades:Trades[*]图4-69供应者与买家关联类的设计关联类在实际设计中十分有用,但现在的OO语言不直接支持关联类,可以这样设计:26釜紊叙墓悍润磺率造够絮障盟方蒂奠棠悟韩透违靛宰剖讯铭钳揽逗章食崔面向对象的设计-面向对象的设计-上述设计有两点不足:#找出对应一宗交易的都要花费一定的力气26Suppliercompany-name:Stringaddress:Stringtrades:Trades[*]Tradeproduct:Stringquantity:IntegerTotal-price:Doublesupplier:Supplierbuyer:Buyer
Buyername:Stringaddress:Stringtrades:Trades[*]1*1*图4-70交易的一个通用方法把供应者和买家对象直接放到交易中作为它的属性。用二元关联类的方法来解决27庙戚山炎淘田渊伦伺犁益又窃戏鸡隙位狭缉俞疤嘎废餐栖惧壬版轧暴馁恨面向对象的设计-面向对象的设计-Buyer1*1*图4-70交易的一个通用方法把供应者和买27例如:飞机在每次飞行中,有两个驾驶员(pilot-”人”类),航班(Flight),飞机(Airplane)和人(Person),有如下两个设计,评价设计。AirplanePersonFlight12pilot(a)PersonDuty2*(b)FlightAirplane*1pilot任务二元关联类的每个实例,描述两个类对象之间的link的性质。本例中航班对象包含航班号、时间等数据,对两个驾驶员是一样的,航班不应是飞机和人员的关联类。每个航班对象与一架飞机和两个驾驶员有关系。在某一航班中,每个驾驶员有自己的任务,作为关联类来模拟。第2个设计允许一个驾驶员工作在不同航班,执行不同任务(时间不冲突便可)。图4-71比较两个设计28踌鄂守缝猖拈未泅隅瞒床怪浊烃杜侵障色擂细编幼绍弃摔脉坛碰曝缘硬舍面向对象的设计-面向对象的设计-例如:飞机在每次飞行中,有两个驾驶员(pilot-”人”类28(1)调整继承结构4.4.3对结构的优化(2)解决死板的继承(3)关于关系环的问题29历押翘梅侄沂晦樟隅辑蔗宴咒棚椭掘贝丰谢镜拼窒缉洒首浆蚁弯川捡辙呐面向对象的设计-面向对象的设计-(1)调整继承结构4.4.3对结构的优化(2)解决死29(1)调整继承结构图4-72继承与委派机制ListNamelengthAddRemoveFirstlastStackPUSHPOPstack:List1PUSHPOP改为委派AddRemoveFirstlastList30《delegate》腹幅腰锤沉睡莲沁佑拄海敦先撂战抿珍遭亿犹御缅庐涵低岛坞翰池渡泡缄面向对象的设计-面向对象的设计-(1)调整继承结构图4-72继承与委派机制ListNam30委派机制我们经常有这样的一些需求,我们只想继承一个类的部分功能,而另外一部分功能是我们不想要、甚至是对我们有害的功能,这时候,我们只能使用委派技术,而不能使用继承了。基于上面的一些分析,我们知道,继承和委派技术都能扩展一个类,使它拥有另外一个类的部分或者全部功能。但委派技术更为灵活,它可以使得一个类可以全部或部分的扩展得到另一个类的功能,而继承只能是全盘接收。classFoo{
deftest(){
println“haveatest”
}
deffoo(){
println“foo...”}
}classFoo2{
privatedelegate=newFoo()
deffoo()
{
this.delegate.foo()
}
deftestAgain()
{
println“testitagain”
}}31翼瑰肤虾氏拙攀弟到纪洞喘洛然了愿摄逸杂展蓑群绪兽乱环斤蛇酞和谎械面向对象的设计-面向对象的设计-委派机制我们经常有这样的一些需求,我们只想继承一个类的部分功31(2)解决死板的继承PersonUserBuyersupplier**交易图4-73产生互不相容的子类图4-74增加的角色类(手柄样式)RoleUserBuyersupplier**交易Person1*用户与供应者的交易受到了限制一个人的对象可以有用户和买家的角色32尧咯赂咆咯卿土硫蹿动阜籽绿卿中货苏山艘燎辩完裕卒仕尉妹钝梆散薯润面向对象的设计-面向对象的设计-(2)解决死板的继承PersonUserBuyersupp32(3)关于关系环的问题ABFolderItemFolder正向容纳反向容纳图4-75文件夹单项与文件夹关系环VersionRevision图4-76原版与修订版10..1previousnextFolderItemFolderFolderItemFolder图4-77文件夹单项与文件夹关系环分解
分解使关系明确,证实设计的正确,行为特性更为明显但未分解的类图更为简洁,可直接与实施程序对应33黑逐绵芜水旦岳葫疤蛰塔审碾嚼吹沏嚎宛惟选纱潍刷夫诽喇窘竞专解缴盼面向对象的设计-面向对象的设计-(3)关于关系环的问题ABFolderItemFolder33关系环能真实地反映实际应用情况:如电脑系统的局部类Permission许可UserFileComputerSystem*1FolderItem文件夹项FileSystemFolder1..*11..**1*Owner0..*10..1**0..1*图4-78电脑系统的局部类34迫凶侨而腮拔寡肺韧缔猩钧滞裔童食始藕焚婚晃那或碧择瞅剪虱柴全莆吠面向对象的设计-面向对象的设计-关系环能真实地反映实际应用情况:如电脑系统的局部类Permi34图4-79属性、零件、部件组成的双重关系环PartComponent1Attribute*1*containscontains属性、零件、部件组成的双重关系环35活续遵肌仿揪赠霜疗象搽雨惹咐庄疙讥低爆摸屁戍怕腑沸税探牢栅贾帖埃面向对象的设计-面向对象的设计-图4-79属性、零件、部件组成的双重关系环PartComp35GroupItemSquare1..*containsCircle1图4-80有叶结点类的关系环有叶结点类的关系环36蜗草吉嘿逆推乓惊媒肃胎攘氦览膘度吩氢寥肥捐隔疼概腮嵌载咒鱼抗锁沏面向对象的设计-面向对象的设计-GroupItemSquare1..*containsCir36反向关系环;二元关联类;网络与结点是Link的对象管理器;谁负责管理连接对象?例:如下是模块(Module)、网络(Nework)、结点(Node)、连接(Link)的两个设计,试进行评价。
Module1*NeworkNodeLink1..***111Module*NeworkNodeLink1..*1*反向关系环;递归关联;连接类与基类相连,复用源码;结构简化,避免重复和模糊的连接。图4-81评价两个反向关系环设计37朽北态敦惰赐么缮妙惨吸览竣获由偷凋锥阻币话典衡错赋棚酮搭衡镶丫隋面向对象的设计-面向对象的设计-反向关系环;例:如下是模块(Module)、网络(Newo374.4.4应用设计模式(DesignPattern)定义操作(1)设计模式的概念(3)设计模式的分类38(4)设计模式的关系(5)介绍职责分配中通用原则的模式(2)模式的组成元素讼涤伸皖缺韵汽皿谚样距啼影舞马了鞘雹回沼虑耕俏床址举苞散先晌昌眷面向对象的设计-面向对象的设计-4.4.4应用设计模式(DesignPattern)定38(1)设计模式的概念(designpattern)Alexander给出了经典定义:“每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决核心。通过这种方式,你可以无数次的使用那些已有的解决方案,无需在重复相同的工作。”模式描述为:在一定环境中解决某一问题的方案,包括三个基本元素——问题,解决方案和环境。39擎孙窍腾茎霞秋荚铲痒多噪膊疹惶职逼甩诡阐朽踊崩豺武懒琐滨仰纹契仅面向对象的设计-面向对象的设计-(1)设计模式的概念(designpattern)Ale39(1)设计模式的概念(designpattern)设计模式(designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。ErichGamma,RichardHelm,RalphJohnson&JohnVlissides四人的《设计模式》(1995年出版)是第一次将设计模式提升到理论高度,并将之规范化。提出了23种基本设计模式,自此,在可复用面向对象软件的发展过程中,新的大量的设计模式不断出现。40矛涤傣享午煮狙伟沛琵围讯刀狗钞搪渣陡娠笼技挨消扬箩团教溉忽吏视蛙面向对象的设计-面向对象的设计-(1)设计模式的概念(designpattern)设计模40模式名问题情景约束(2)模式的组成元素解决方案例子结果情景41壁茁拘陪荚宋察帘壳吓靠笆湘揍劣艰婆氨咨蛮丹酬箱咎露酶土广怯擒彭洪面向对象的设计-面向对象的设计-模式名(2)模式的组成元素解决方案41壁茁拘陪荚宋察帘壳吓41(3)设计模式的分类42创建模式:对类的实例化过程的抽象。一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。创建模式描述了怎样构造和封装这些动态的决定。包含类的创建模式和对象的创建模式。结构模式:描述如何将类或对象结合在一起形成更大的结构。分为类的结构模式和对象的结构模式。类的结构模式使用继承把类,接口等组合在一起,以形成更大的结构。类的结构模式是静态的。对象的结构模式描述怎样把各种不同类型的对象组合在一起,以实现新的功能的方法。对象的结构模式是动态的。行为模式:对在不同的对象之间划分责任和算法的抽象化。不仅仅是关于类和对象的,并是关于他们之间的相互作用。类的行为模式使用继承关系在几个类之间分配行为。对象的行为模式则使用对象的聚合来分配行为。耻钩倒几因葱陷捂处闭曹铆倦箍侧丽近钙瞅绦蜡庙嫌床盯恍议阉东崖炳凡面向对象的设计-面向对象的设计-(3)设计模式的分类42创建模式:对类的实例化过程的抽象。42AbstractFactory:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。FactoryMethod:定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。Prototype:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。创建型模式43棍者泄辐震孤苟师拘捍抱按都撬绎揽尉岂香实闭减大旅佑海僻摊凿男随勃面向对象的设计-面向对象的设计-AbstractFactory:提供一个创建一系列相关或相43结构型模式Adapter:将一个类的接口转换成客户希望的另外一个接口。Bridge:将抽象部分与它的实现部分分离,使它们都可以独立的变化。Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。Decorator:动态地给一个对象添加一些额外的职责。Façade:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。Flyweight:运用共享技术有效地支持大量细粒度的对象。Proxy:为其它对象提供一种代理以控制对这个对象的访问。44流区熟哼绚段维春汛瓶桥毋乔支矾沤贸虏灰抬回费远筷确送剁钮扼焦殉免面向对象的设计-面向对象的设计-结构型模式Adapter:将一个类的接口转换成客户希望的另外44ChainofResponsibility:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。Interpreter:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语句中的句子。Iterator:提供一种方法顺序访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示。Mediator:用一个中介对象来封装一系列的对象交互。行为型模式45鸟爸树旨南饼父新氨满搂靛是比飞龚次哎鬼粹号诌逃氧楚惯鸵甘袒痈釉揣面向对象的设计-面向对象的设计-ChainofResponsibility:使多个对象都45行为型模式Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。Observer:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。State:允许一个对象在其内部状态改变时改变它的行为。Strategy:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。TemplateMethod:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Visitor:表示一个作用于某对象结构中的各元素的操作。46蝴义圭党茶拴赐碍黔匠分截鹤晋泽袖呼胯诗士谣三熏椒鸿疏各鱼然罗辣槐面向对象的设计-面向对象的设计-行为型模式Memento:在不破坏封装性的前提下,捕获一个对46(4)设计模式的关系47鲁额谅筛接鄂哆巾衰顶栗仓寸过懊闷缀举亢挽浚毒鳃幌危数循现地提崔果面向对象的设计-面向对象的设计-(4)设计模式的关系47鲁额谅筛接鄂哆巾衰顶栗仓寸过懊闷缀47(5)介绍职责分配中通用原则的模式描述将职责分配给对象的基本原则。
专家(Expert)创建者(Builder)高聚合度或高内聚(Highcohesion)低耦合度或低耦合(Lowcoupling)控制者(Controller)五个模式将分析阶段漏掉的类型加入到对象模型中。48屯荧运歉薪铭骆登敝卸琉凛肖贵账猛比公渠盒尸香箩钮环廖番紧肮俭广济面向对象的设计-面向对象的设计-(5)介绍职责分配中通用原则的模式描述将职责分配给对象48
解决方案:将一个职责分配给信息专家。
问题:面向对象的设计中什么是最基本的职责分配原则。
专家
49墙羹者失锤贱袖绍绚泰给馁球绣宾问芬计赖龙灰催弧颖茶赁柑妮馅咖淫贝面向对象的设计-面向对象的设计-解决方案:将一个职责分配给信息专家。专家49墙羹者失锤49SaleDatetimequantitySalesLineItemdescriptionpriceUpcProductspecification1..*Contains(包含)*DescribedbySale(销售)类职责知道销售总额SalesLineItem(销售细项)知道销售项记录了金额ProductSpecification(产品说明)知道商品价格
确定销售总额(grandtotal)需要知道什么信息?图4-82Sale类的类图销售系统50棒桔古拎显关雁炽犹赦增盲委谆绷它氯堂鞠秋务泊乙霸颧夏省勋澜舀凯墒面向对象的设计-面向对象的设计-SaleDatequantitySalesdescripti50Sli:SalesLineItem
2:st=substotal():ProductSpecification2.1:p:=price()1*:[foreach]sli:=next():Salet:=total():SalesLineItem图4-83计算Sale总额SaledateTimetotal()SalesLineItemQuantitysubtotal()ProductSpecificationdescriptionPriceUPCprice()51小豫模笑唤强叉冬帽氢剥击擦晨似胡星油闲殴琅夫牛谢巢喀蹿绢听庄障决面向对象的设计-面向对象的设计-Sli:SalesLineItem2:st=subst51说明:专家模式表明了“对象所能完成的工作要依赖于它所掌握的信息。为了履行职责需要获取散布在不同对象中的信息。表明系统中存在许多“部分”专家,在完成任务时需要它们的协作。软件对象之间的合作就像人之间的合作一样。对象所做的事情与它们所知道的信息相关。“把责任交给数据”;“谁知道谁来干”;“自己做”;“把服务推给要操作的属性”。封装性好;高内聚。52贤森盼楔灭衫引镐但笼便从仍衔然缩屿涵掷卞帖胯缆蕊绵额旭莽京凝死鲁面向对象的设计-面向对象的设计-说明:专家模式表明了“对象所能完成的工作要依赖于它所掌握的信52Builder模式:用于指导对象实例创建任务的分配。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者(Builder)模式Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。用户不知道内部的具体构建细节。Builder模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到。53煞裤睡弱乐领除侵毡甸迫教瞩锻赠麓纠淌需氮聚骸宠替牟枉讶檀曾挽赚资面向对象的设计-面向对象的设计-Builder模式:创建者(Builder)模式Builde53是为了将构建复杂对象的过程和它的部件解耦。注意:是解耦过程和部件。因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮方向盘发动机还有各种小零件等等,部件很多,如何将这些部件装配成一辆汽车,这个装配过程也很复杂(需要很好的组装技),Builder模式就是为了将部件和组装过程分开。用于指导对象实例创建任务的分配。为何使用?54创建者(Builder)模式捶骆函尾堡盔犊看啡咒酚均尚朋翱捶伸羽键侣乐禹瓣沧庞茸豆褐友磋若朵面向对象的设计-面向对象的设计-是为了将构建复杂对象的过程和它的部件解耦。为何使用54方案:将创建一个类A的实例的职责指派给类B的实例,若下列条件满足:B是A对象的创建者。
B聚集了A对象B包含了A对象B记录了A对象的实例B要经常使用A对象当A的实例被创建时,B具有要传递给A的初始化数据如何使用?55创建者(Builder)模式避霓意烬煽慧猩郡彭剐暗汛宝坞呐谨盎痒陌琅亚领芥盎腮涩候灶薪褥赵路面向对象的设计-面向对象的设计-方案:将创建一个类A的实例的职责指派给类BB聚集了A对象如55创建者(Builder)模式Builder模式结构:56蛀械彻峦垄疆致彤供税袱牧扳蹬散葬问濒极丁汲疾擎喂趴览毛嘱镣概川惺面向对象的设计-面向对象的设计-创建者(Builder)模式Builder模式结构:56蛀械56创建者(Builder)模式Builder模式结构:Builder:为创建一个Product对象的各个部件指定抽象接口。ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件;定义并明确它所创建的表示;提供一个检索产品的接口。Director:构造一个使用Builder接口的对象。Product:表示被构造的复杂对象;包含定义组成部件的类,包括将这些部件装配成最终产品的接口。57窜狙拣循葬摇涂喂阵芽戎皋矛溜躁佣狂产痉这煤漓胡冬贴粮剐延龄背俐巩面向对象的设计-面向对象的设计-创建者(Builder)模式Builder模式结构:Buil57在Java实际使用中,经常用到“池”(Pool)的概念,当资源提供者无法提供足够的资源,并且这些资源需要被很多用户反复共享时,就需要使用池。“池”实际是一段内存,当池中有一些复杂的资源的“断肢”(比如数据库的连接池,也许有时一个连接会中断),如果循环再利用这些“断肢”,将提高内存使用效率,提高池的性能。修改Builder模式中Director类使之能诊断“断肢“断在哪个部件上,再修复这个部件。应用:58寨宦劣哟舟架视责满轿桃趁趴蛛毅陀腊域免耽扇捎州粤呛歼凄捌缠蝎篇椒面向对象的设计-面向对象的设计-在Java实际使用中,经常用到“池”(Pool)的概念,当资58图4-84创建一个SalesLineItem的实例
:Sale:SalesLineItem1:create(quantity)makelineItem(quantity)datetimeSalemakeLineItem()total()新方法在销售点应用中,哪个类负责创建一个SaleLineItem实例?根据创建者模式,应当找出一个类,这个类聚集、包含了SaleLineItem的实例。实例:59桌纫翘琶筐寿希揖蔽纷未石竣吹欺禄粘悬聪水篮颓方标两嗡倔藐烫底骄需面向对象的设计-面向对象的设计-图4-84创建一个SalesLineItem的实例:Sa59结论:创建者模式,用于指导实例的创建任务分配,要找到一个与被创建对象之间有关联关系的创建者。职责的确定和分配在绘制协作图的语境中进行。职责的履行由方法调用来具体实现。创建者模式说明聚合/包容器类/记录类是一个承担创建被包含或被记录的事物职责好的候选者。60靛隶通雾炽花剂蹈整左打长疾悟啸蹦么揉栽城月酮乔危趾变皆澈汕驮减埃面向对象的设计-面向对象的设计-结论:创建者模式,用于指导实例的创建任务分配,要找到一个与被60
解决方案:在分配一个职责时,要保持低耦合度。问题:如何支持低依赖关系和增加重用。低耦合度模式61民谓栏港氰朽佯钾州屎毛规斑琼心沉悯飞关晤祈蔡深喧检车婚湍散绘膳洗面向对象的设计-面向对象的设计-解决方案:在分配一个职责时,要保持低耦合问题:如何支持低61例如:从销售终端应用系统中抽取如下三个类
Sale实例创建payment的实例(方案2):Post:Payment:Sale1:makePayment()makePayment()1.1:create()图4-87Sale实例创建payment实例
Post实例创建Payment的实例(方案1):PostP:Payment:Sale1:Create()makePayment()2:addpayment(p)图4-86Post实例创建payment实例PaymentPostSale图4-85销售终端系统部分类62颗守铬吩膝断路吱掷瞎摇鸳蹋哼将溪曼办仕埔闯士听继魔娶旁悠仑也裳羔面向对象的设计-面向对象的设计-例如:从销售终端应用系统中抽取如下三个类Sale实例创建62在C++、Java中从类型X到类型Y的耦合有:#类型X有一个属性(数据成员或实例变量)引用类型Y的实例或类型Y本身#类型X有一个方法以各种方式引用了一个类型Y的实例或类型Y本身(Y的局部变量或参数),或从一个消息返回的对象是类型Y的实例。
#类型X是类型Y的一个直接的或间接的子类。#类型Y是一个接口,类型X实现了这个接口。说明:63涤榜写步躁件殆构阀断楼逮赊拧绪回草晓铰近聊棍着君膝枯醒篇立腐圣宁面向对象的设计-面向对象的设计-在C++、Java中从类型X到类型Y的耦合有:#类型X有63低耦合度在设计过程中是要记住的一个原则,它是一个时刻要注意的隐含设计目标。说明:低耦合度支持更独立的类设计,支持重用,如果不以重用为目的,耦合就不重要了。低耦合度支持更独立的类设计,支持重用,如果不以重用为目的,耦合就不重要了。不能孤立地考虑低耦合度,与专家、高内聚模式有关。完全没有耦合的设计也是不可取的,类之间应当保持中等程度的耦合是合理的。64术仟吞狡易拌待脉梨杂熬柄道毙姓常戒拎羞枷蛰诣啪掇枕醋姿奥逸峙溜凭面向对象的设计-面向对象的设计-低耦合度在设计过程中是要记住的一个原则,它是一个时刻要注意的64解决方案:在分配一个职责时,要保持高度聚合。问题:如何将复杂性保持在可控制范围内?高聚合度模式65恭毕汞姥喂颠劫惧晚痘年砌驰涧悄载做草猪沽嫂购赖斌巩马绝诽矛蕾新掌面向对象的设计-面向对象的设计-解决方案:在分配一个职责时,要保持高度聚问题:如何将复杂65代表整个“系统”的类代表整个企业或组织的类代表真实世界中参与职责(角色控制者)的主动对象类代表一个用况中所有事件的人工处理者类解决方案:将处理系统事件消息的职责分派给代表下列事物的类。控制者66驹逝匿西琼扇沤尿铺咽冤恭馅碉寇募娥择胚窖驹褂昏圆仍泵奈煤假泅迄您面向对象的设计-面向对象的设计-代表整个“系统”的类解决方案:将处理系统事件消息的职责分派66控制者问题:谁来负责处理一个系统事件?系统事件(systemevent)
由某个参与者发起的指向系统的输入事件系统操作(systemoperation)
系统响应这些事件而执行的操作控制者(controller)
控制者定义了系统操作的方法67茬则兼燎幻拭玩直妈羹讼骑年玛痞虽谐厚吧罚枪颂氯雅梢沽炼褐珐疽晦逊面向对象的设计-面向对象的设计-控制者问题:谁来负责处理一个系统事件?系统事件(syst67:SystementerItem(UPC,quantity)enterItem为系统事件,触发了一个同名的系统操作,系统操作带有参数。事件是命名的动因;操作是对动因的响应。图4-88系统事件68释幅鼠侥语踢辫吵逸模惑蹭鹅隙饥动膀媳沈蝗落剿宝津诈誉娱贞捞悟倡柴面向对象的设计-面向对象的设计-:SystementerItem(UPC,quantity)68:SystementerItem(UPC,quantity)enterKerPressed(UPC,quantity)较差的名称较好的名称对操作的命名:要抽象出最高层次或使用操作的最终目标耒对操作的命名。图4-89在比较抽象层次上对事件和操作命名如对一个记录支付信息的操作命名如下:enterAmountTendered(amount)较差enterPayment(amount)较好makePayment(amount)更好一些69萨企鳞累古公霜摸栓绚辖鹿俘眨古粳犁炉蔫俄橙一毋央羹或窖司陆怂誓筐面向对象的设计-面向对象的设计-:SystementerItem(UPC,quantity)69例如:在销售终端系统应用中的系统操作
SystemendSale()enterItem()makePayment图4-90一个名为System类型中的系统操作这个图与概念模型的区别:概念模型中的元素是真实世界中的概念,显示的只是静态信息。System类型像人为的概念,描述系统行为,动态信息。70捆亥慧哩肌差喻卢奄擞出吨簿撕蓬楷孩灭痰窘键功敞少料豹盛行逾作毡仆面向对象的设计-面向对象的设计-例如:在销售终端系统应用中的系统操作SystemendSa70
代表整个系统的类代表整个企业组织者的类代表真实世界参与职责的主动对象类代表一个用况中所有事件的人工处理类哪个类对象应该是系统事件的控制者?根据控制者模式,可选择system:postendsale()enterItem()makepayment图4-91系统操作的分配enterItem(upc,quantity):postenterItem(upc,quantity):storeenterItem(upc,quantity):cashierenterItem(upc,quantity):BuyItemsHandler71焕恒枯荐纯趁意危塌格钳线据霹彩杖盎果玫宵脯翰阔累炎岗瓦井刨界茨燕面向对象的设计-面向对象的设计-代表整个系统的类哪个类对象应该是系统事件的控制者?根据控71说明:无论采用何种输入手段,必须由控制者来处理系统输入事件。一个用况中的所有系统事件都应由同一个控制者来处理,这样才能维持一个用况的状态信息。“系统类”是虚包的控制者,把它看成是整个系统代表或一个物理单元。只有当不能将系统事件消息发向替代的控制者时才使用虚包类。控制者类也不能承担过多的职责。注意角色控制的使用:
所创建的角色易出现低聚合的危险;不要使角色像人一样承担了所有工作。72哭街另盼斗赏淤焊各聪缚寺摘吏谣绎回乡勿盯卞挛斌郭姜牟郝力铸闪儡全面向对象的设计-面向对象的设计-说明:无论采用何种输入手段,必须由控制者来处理系统输入事件。72
例如:从表示层到领域层的耦合
Objectstore
UPCQuantityTotalTenderedBalanceEnterItemEndSaleMakePayment出纳员:Postapplet:Post:SaleonEenterItem()1:enterItem(upc,qty)1.1:makeLineItem(upc,qty)系统事件消息控制者表示层(JavaApplet)领域层×_图4-92从表示层到领域层的耦合73侩妇醒媚桐料业溅彝崎培器垫详割惹戳炊束殿犬帘扎锋首螟筹氢购锭蹄恩面向对象的设计-面向对象的设计-例如:从表示层到领域层的耦合Objectstore734.4.5检查系统设计74(1)检查“正确性”(2)检查“一致性”(3)检查“完整性”(4)检查“可行性”艾锁世脉寓彰敛梦栋卸诚硝伯说充点埃恨棒掉拍挚瓶踊胁谎瓢鸵诫友筛巡面向对象的设计-面向对象的设计-4.4.5检查系统设计74(1)检查“正确性”(2)74(1)检查“正确性”每个子系统都能追溯到一个用例或一个非功能需求吗?每一个用例都能映射到一个子系统吗?系统设计模型中是否提到了所有的非功能需求?每一个参与者都有合适的访问权限吗?系统设计是否与安全性需求一致?75竖朴锚盯遣朗蝎京乍单崖恢蔗所齿硒朗涎呀杂镜胃酗围毯谴碾谰漱褥赖争面向对象的设计-面向对象的设计-(1)检查“正确性”每个子系统都能追溯到一个用例或一个非功75是否将冲突的设计目标进行了排序?是否有设计目标违背了非功能需求?是否存在多个子系统或类重名?(2)检查“一致性”76廖奥金馆囤授龋酮召胳苍累碧佯霜疮喉辛衅万冰滨措梯盒禹篆郁才今酌乍面向对象的设计-面向对象的设计-是否将冲突的设计目标进行了排序?(2)检查“一致性”76廖76是否处理边界条件?是否有用例走查来确定系统设计遗漏的功能?是否涉及到系统设计的所有方面(如硬件部署、数据存储、访问控制、遗留系统、边界条件)?是否定义了所有的子系统?(3)检查“完整性”77醚疥盖灰衣维囊姆痛遣菇董征蝗臭逸作蕾馒琉噶州捐坑萤措翔巡敬壹凋咙面向对象的设计-面向对象的设计-是否处理边界条件?(3)检查“完整性”77醚疥盖灰衣维囊姆77系统中是否使用了新的技术或组件?是否对这些技术或组件进行了可行性研究?在子系统分解环境中检查性能和可靠性需求了吗?考虑并发问题了吗?78(4)检查“可行性”臃角燥鹿兵蹄潘藉浩栗淋雕烘级佰够脐晾资君踏幂陇罪炉焊养胃次挡母呵面向对象的设计-面向对象的设计-系统中是否使用了新的技术或组件?是否对这些技术或组件进行了可781)逻辑结构和物理结构的设计;2)对象设计
属性的优化关联的优化使用设计模式确定和优化操作79总结1.设计阶段要做的工作缅晕蹈灶捅暴胁胺徽歌呸险斥瓶当计痈粮敏言翟榆绿环作耀宴吗置渴素酥面向对象的设计-面向对象的设计-1)逻辑结构和物理结构的设计;79总结1.设计阶段要做79总结2.面向对象的设计原则1)采用了模型化的观点;2)
使用了抽象、封装、继承等机制;3)模块化机制:交互耦合、继承耦合;服务内聚、类内聚;4)可重用机制、灵活性机制、可移植性机制。80嫌阮谨抑岭驼腕鹏倪玫害裳勺虚备翔苫钒儡藏拽牌竞琐业武剿替冤锋川疟面向对象的设计-面向对象的设计-总结2.面向对象的设计原则1)采用了模型化的观点;2)80使设计泛化;提高抽象,提高内聚性,降低耦合的设计原则;设计要包含钩子,使他人可添加功能;简化设计。注意:克隆(clone)并不能看作是重用。克隆是将代码从一个地方复制到另一个地方。提高可重用性设计的策略81褒仗棠皿若贡亩德吁灶忙帘剖壕辆脉琶颗降竿腕此赣惯疹讯垛塌歧怨窗良面向对象的设计-面向对象的设计-使设计泛化;提高可重用性设计的策略81褒仗棠皿若贡亩德吁灶81@提高内聚性,降低耦合。@不要将代码写死。应消除代码中的常量。应在服务器启动时从配置文件中读取最大值或向用户提供一个选项对话框,可修改该值。@建立抽象。建立多态操作的接口和超类,功能易扩展。@打开所有选项。方法中有异常时,应抛出异常,而不是执行特定动作处理该异常。@使用并创建可重用代码。提高灵活性设计的策略82揽僧宴班怂弛铸郑肛沮路勿松沿践咀另濒渊谐邪赔颧自象币享巡脐虑陨剧面向对象的设计-面向对象的设计-@提高内聚性,降低耦合。@不要将代码写死。应消除代码中的82#避免使用特定环境的专有功能。#语言的一些功能依赖于硬件体系结构(C++)要知道一个字中字符的顺序,以及整型变量的位数。
#类库也存在着差别(Java)。
#移植性问题与文本文件有关,各种平台中用来终止一行的字符都不尽相同。提高可移植性设计的策略83葱懂枝串伪薪苔冠凉鲜宇宪嘴棘惹耗须仟责涉析污耙眯篷总慎鸦逃丢威琶面向对象的设计-面向对象的设计-#避免使用特定环境的专有功能。#语言的一些功能依赖于硬件83图4-93类的实现顺序POSTendSale()enterItem()makePayment()SalesLineitemquantity:Integersubtotal()Saledate:DateisComplete:Booleantime:TimebecomeComplete()makeLineItem()makePayment()Total()address:Addressname:TextaddSale()
StorePaymentamount:Quantity
ProductCatalogspecification()ProductSpecificationdescription:Textprice:Quantityupc:UPCHouses11Uses11Looks-in111..*1ContainsCaptures1111..*Contains1Describes*11Paid-by*1Loge-completed11234567总结3.设计的结果--面向实现的类图84叫荐醉运号户咎驻反沼烃邢始攘拜戈惠鼓君饶圭恤豁晌凄昏仔下遂衡棺累面向对象的设计-面向对象的设计-图4-93类的实现顺序POSTSales84packagepost;publicclassPayment{privatefloatamount;publicpayment(floatcashTendered){this.amount=cashTendered;}publicfloatgetAmount(){returnamount;}}ClassPayment85沸香冠顺日键辐葛尸下绞乡洋嗽亡缔疾剃摈胡砖妒诡剁瞧爆效烘踏衣援骡面向对象的设计-面向对象的设计-packagepost;ClassPayme85packagepost;publicclassProductSpecification{privateintupc=0;privatefloatprice=0;privateStringdescription=“”;publicProductSpecification(intupc,floatprice,Stringdescription){this.upc=upc;this.price=pricethis.description=description;}publicintgetUPC(){returnupc;}publicfloatgetPrice(){returnprice;}publicStringgetDescription(){returndescription;}}ClassProductSpecification86凛散股墟翌靖焕模铁掷摇腋喳猖蝉憋商柏懂寞墙狐挞屡娘牲番焉掀春款它面向对象的设计-面向对象的设计-packagepost;ClassProduc86
对象设计的主要任务:精化类的属性和操作明确类之间的关系整理和优化设计模型4.4对象设计第4章面向对象的设计87松惰剥碗比菲迪糠紊务峻鳞背瓜奖绿熄郑拥姨捞溉吐蹿初俩门扁仔晚胃埋面向对象的设计-面向对象的设计-对象设计的主要任务:4.4对象设计第4章面向87
4.4.1对类的属性的处理4.4.4应用设计模式定义操作4.4.2关联的设计4.4.3对结构的优化4.4.5检查系统设计88内容匀啮颅特搔塔舶忍卷畦临腕站棵搜族颗特白比蹬弊柜刚糟枉篱战僳织瘟垣面向对象的设计-面向对象的设计-4.4.1对类的属性的处理4.4.4应用设计模式定884.4.1对类的属性的处理(1)回顾属性的来源(2)成员细节的表示89(3)在哪里展示非简单数据类型和纯数据值?
(4)对属性的数量和单位建模(5)对属性的处理(6)外部键的属性咒颧琶疽平刘息舆驰郎湍酌惫甭忙税奥拢亭蹭捧疟窄札骚童癣粗偷被健毙面向对象的设计-面向对象的设计-4.4.1对类的属性的处理(1)回顾属性的来源(2)89(1)回顾属性的来源类所代表的现实实体的基本信息;描述状态的信息;派生属性(derivedattribute)如:类CourseOffering中的“学生数目”/numStudents:int描述该类与其他类之间关联的信息;其他常见的类型:
地址Address、颜色Color、几何元素Geometrics、电话号码PhoneNumber、通用商品代码UPC、社会安全代码SocialSecurityNumber、邮政编码PostalCode、枚举类型等。90收时嘱毗京普炮双瞒坏当桓闸尾城嚼释衔腊裕鹏申该轨限腊叙滔磺国德愈面向对象的设计-面向对象的设计-(1)回顾属性的来源类所代表的现实实体的基本信息;描述状态90具体说明属性的名称、类型、缺省值、可见性等;Public:‘+’;Private:‘-’;Protected:‘#’。(2)成员细节的表示基本原则尽可能将所有属性的可见性设置为private;仅通过set方法更新属性;仅通过get方法访问属性。图4-56有细节的类图91燃由硼豫漆羽翼刘茎倘接箭辊家半坑遥妻雇岭多钳倒眺苇占价定嘱份排辫面向对象的设计-面向对象的设计-(2)成员细节的表示基本原则图4-56有细节的类图5燃由91(3)在哪里展示非简单数据类型和纯数据值?
ProductSpecificationupc:UPCStoreAddress:AddressProductSpecificationUPC*1StoreAddress*1UPC是非简单数据类型(要对它进行验证,也可包括制造者属性),即有属性和关联,也可用概念来表示。UPC是纯数据值,在概念模型中当作属性看待。
图4-57用概念表示属性UPC是一个纯数据值,但也可以是一个非简单数据类型。92逸冈舞推踢三萎弛揽奖汲骗县棘闷以铱雾虹梅竿勘赐稠宏甭盒亨敞伟论跃面向对象的设计-面向对象的设计-(3)在哪里展示非简单数据类型和纯数据值?Product92(4)对属性的数量和单位建模Paymentamount:NumberPaymentQuantityamount:Number*1Paymentamount:Quantity数量是纯数据值,可作为属性这个表示可用,但不灵活或不可靠,要知道支付货款时所用的货币单位。
UnitHas-amountIs-in*1将数量作为一个单独概念图4-58对属性的数量和单位建模93熄瓷炕巨要诸心熬南毅狙幻博捅准钨屁骏巨窿滥陌剖毅彩庶纬只湘净撇擞面向对象的设计-面向对象的设计-(4)对属性的数量和单位建模PaymentPaymentQ93(5)对属性的处理保留派生属性,避免重复计算描述其他事物的规格说明Flight航班datanumbertimeAirport机场nameFlies-to*1Flight航班datatimeDescribed-by*1Airport机场nameFlightDescriptionnumber*1Describes-flights-to较好图4-59描述其他事物的规格说明较差
94悸钻闺鼠撒恨寨引放误药苟椅死浑硅娠议呼数忙似疽淀背掳砂源磋骤淳琼面向对象的设计-面向对象的设计-(5)对属性的处理保留派生属性,避免重复计算描述其他事94分析阶段的数据类型只能是简单的、原始的数据类型,并不表示如C++、Java、Smalltalk中的属性(数据成员、实例变量)
(分析中的类图是对问题的存在建立的分析模型,而不是软件实体的分析模型)。在软件构造和设计阶段,对象之间的关联通常是用指向其他复杂类型的属性来表示(但不是唯一的解决方案)。(6)外部键的属性95涌感拥芒辙蜀风陨赘冰轿染祁况惭猾湿鞠宁杉拎备除丧趋服矽榔条支兄秩面向对象的设计-面向对象的设计-分析阶段的数据类型只能是简单的、原始的数据类型,并不表示如C95在分析阶段的对象模型中,不是使用属性,而是使用关联来联系两个概念的。设计中的类图,使用外键实现对象间的联系。CashiernamePOSTnumberUses11图4-60不使用外部键的属性CashierNamecureentPOSTNumber使用外部键的属性与另一个对象发生联系
图4-61有外部键的属性96(6)外部键的属性菊藩壳札孺绵旅钢仿辑蓟句他羡敝麦腾佑嫌什暗竣骆绽似彝诡穿柑郎燃榨面向对象的设计-面向对象的设计-在分析阶段的对象模型中,不是使用属性,而是使用关联来联系两964.4.2关联(Association)的设计(1)四种连接(2)增加冗余关联,提供访问效率(3)对限定关联(qualifiedassociation)的考虑(4)增加关联的导航(navigability)(5)对关联类的设计97市蔼哗碳涕快鲤永津哗僵次蛰市增爷买宛模柠掳埋惟虾虞栏毕轮恳掇恋快面向对象的设计-面向对象的设计-4.4.2关联(Association)的设计(1)97(1)四种连接全局(global):某个对象可以在全局范围内直接被其他对象“引用”。
参数(Parameter):某个对象作为另一个对象的某个操作
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 63522-9:2025 EN-FR Electrical relays - Tests and measurements - Part 9: Climatic tests
- 2025年现场施工管理考试试题及答案
- 2025年水利工程管理测试试卷及答案
- 2025年宝石学与鉴定技术考试卷及答案
- 2025年公共政策分析基础考试试卷及答案
- 2025年公共健康科学考试试题及答案
- 2025年公共卫生与预防医学考题及答案
- 2025年科技与管理结合的职业考试试题及答案
- 2025年户外教育与青少年发展课程考试题目及答案
- 七级语文测试题及答案
- 医疗器械网络销售质量管理规范宣贯培训课件2025年
- SL631水利水电工程单元工程施工质量验收标准第1部分:土石方工程
- DL∕T 5370-2017 水电水利工程施工通 用安全技术规程
- 广东省2024年中考数学试卷【附真题答案】
- (高清版)TDT 1075-2023 光伏发电站工程项目用地控制指标
- 监控立杆基础国家标准
- 亿赛通数据泄露防护(DLP)_CDG_V3.1用户使用手册
- 方格子汉字独体字表
- 德鲁克的绩效观
- 那洛巴尊者传
- 包材产品HACCP计划
评论
0/150
提交评论