版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第十章
更多設(shè)計(jì)模式
舒新峰
西郵計(jì)算機(jī)學(xué)院現(xiàn)代軟件工程西安郵電學(xué)院計(jì)算機(jī)系舒新峰1.迭代2的需求和重點(diǎn)2.更多設(shè)計(jì)模式3.GOF設(shè)計(jì)模式參考資料:(1)UML和模式應(yīng)用,CraigLarman著,第三版,機(jī)械工業(yè)出版社(2)Chap10設(shè)計(jì)與代碼映射西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.1迭代2的重點(diǎn)基本對象設(shè)計(jì)使用模式來創(chuàng)建穩(wěn)健的設(shè)計(jì)應(yīng)用UML使模型可視化makeCreditPayment(credNum,expiryDate)reply:=requestApproval(request)postReceivable(receivable)?actor?:CreditAuthorizationService?actor?:AccountsenterItem(itemID,quantity):NextGenPOSSystem:CashierendSale()ProcessSalePaybyCreditScenariodescription,totaltotalwithtaxes*[moreitems]makeNewSale()?actor?:TaxCalculatortaxLineItems:=getTaxes(sale)postSale(sale)西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.1從迭代1到迭代2在迭代1所有軟件都已經(jīng)被充分地測試客戶定期地參與對已完成部分的評估已經(jīng)對系統(tǒng)(這里的系統(tǒng)也包括所有子系統(tǒng))進(jìn)行了完整的集成和固化,使其成為基線化的內(nèi)部版本西安郵電學(xué)院計(jì)算機(jī)系舒新峰1.3迭代2需求NextGenPOS支持第三方外部服務(wù)的變化,例如,能夠與不同的稅金計(jì)算器相連接復(fù)雜的定價(jià)規(guī)則,可更換的業(yè)務(wù)規(guī)則需要進(jìn)行設(shè)計(jì),使得在銷售總額變化時(shí)刷新GUI窗口西安郵電學(xué)院計(jì)算機(jī)系舒新峰由于這些需求,我們要在迭代2中對處理銷售用例進(jìn)行修訂,但是實(shí)現(xiàn)了更多場景對面向分析的對象的修改在此輪迭代中也是需要的Use-CasesSSDsDomainModel西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.2更多設(shè)計(jì)模式已經(jīng)學(xué)習(xí)的模式包括:信息專家;創(chuàng)建者;高內(nèi)聚;低耦合;控制器還需要學(xué)習(xí)的模式:多態(tài)(Polymorphism)間接性(Indirection)純虛構(gòu)(PureFabrication)防止變異(ProtectedVariation)……西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.2.1多態(tài)(Polymorphism)問題如何處理基于類型的選擇?“If-then-else”;“select-case”如何創(chuàng)建可插拔的軟件構(gòu)件?解決方案當(dāng)相關(guān)選擇或行為隨類型(類)有所不同時(shí),使用多態(tài)為變化的行為類型分配職責(zé)西安郵電學(xué)院計(jì)算機(jī)系舒新峰例子支持多種外部的第三方稅金計(jì)算器它們具有不同技術(shù)實(shí)現(xiàn)的不同的TCPsocketSOAPinterfaceJavaRMIinterfaceTaxMasterAdaptergetTaxes(Sale):ListofTaxLineItemsGoodAsGoldTaxProAdaptergetTaxes(Sale):ListofTaxLineItems<<interface>>ITaxCalculatorAdaptergetTaxes(Sale):ListofTaxLineItemsByPolymorphism,multipletaxcalculatoradaptershavetheirownsimilar,butvaryingbehaviorforadaptingtodifferentexternaltaxcalculators.<???>Adapter......西安郵電學(xué)院計(jì)算機(jī)系舒新峰UMLNotationGoodAsGoldTaxProAdaptergetTaxes(Sale):ListofTaxLineItems<<interface>>ITaxCalculatorAdaptergetTaxes(Sale):ListofTaxLineItemsINTERFACENOTATIONINTERFACENOTATIONInterfaceimplementationisillustratedwithadashedlineandalargeunfilledarrowpointingtotheinterfacefromtheimplementingclass.the<<interface>>elementinguillemetsiscalledaUMLstereotypeReturnorparametertypesthatrepresentacollectioncanbespecifiedinanysyntax,butthisisthegenerallyacceptedcommonUMLstyle.西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.2.1多態(tài)cont.禁忌不要為那些假想中的變化添加太多的多態(tài)優(yōu)點(diǎn)易于增加新變化所需的擴(kuò)展無需影響客戶便能夠引入新的實(shí)現(xiàn)西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.2.2純虛構(gòu)(PureFabrication)問題面向?qū)ο笤O(shè)計(jì)依據(jù)真實(shí)世界中的概念來表示軟件類但是軟件并非真實(shí)的世界我們需要通過領(lǐng)域?qū)訉ο髞砜朔蛢?nèi)聚或者耦合低復(fù)用解決方案對人為制造的類分配一組高內(nèi)聚的職責(zé),該類并不代表問題領(lǐng)域的概念-虛構(gòu)的事物,用以支持高內(nèi)聚、低耦合和復(fù)用西安郵電學(xué)院計(jì)算機(jī)系舒新峰例子為了保存Sale
的實(shí)例到關(guān)系數(shù)據(jù)庫基于信息專家的考慮,存在理由將責(zé)任分配給Sale
類自己.但是考慮如下含義:需要大量的數(shù)據(jù)庫操作,這將使Sale
變得非內(nèi)聚Sale
類必須與關(guān)系數(shù)據(jù)庫接口耦合,這樣增加了耦合將對象保存到關(guān)系數(shù)據(jù)庫中是一個(gè)普遍的任務(wù)-它可以重用西安郵電學(xué)院計(jì)算機(jī)系舒新峰西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.2.2純虛構(gòu)(PureFabrication)討論對象的設(shè)計(jì)可以廣泛的分成兩組表示解析(Representationalposition)行為解析(Behavioralposition)優(yōu)點(diǎn)支持高內(nèi)聚增加了潛在的復(fù)用性禁忌不要過度使用它將導(dǎo)致非O-O的系統(tǒng)西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.2.3間接性(Indirection)問題為了避免兩個(gè)或多個(gè)事物之間的直接耦合,應(yīng)該如何分配職責(zé)?如何使對象解耦,以支持低耦合并提高復(fù)用性?解決方案將職責(zé)分配給中介對象,使其作為其他構(gòu)件或服務(wù)之間的媒介,以避免它們之間的直接耦合優(yōu)點(diǎn)組件之間的低耦合西安郵電學(xué)院計(jì)算機(jī)系舒新峰例子TaxCalculatorAdapterPersistentStorages:Sale:TaxMasterAdaptertaxes:=getTaxes(s)t:=getTotal()theadapteractsasalevelofindirectiontoexternalsystems<<System>>:TaxMasterTCPsocketcommunicationxxx...西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.2.4防止變異(ProtectedVariations)問題如何設(shè)計(jì)對象,子系統(tǒng)和系統(tǒng),使其內(nèi)部的變化或不穩(wěn)定性不會(huì)對其它元素造成不良影響解決方案識別預(yù)計(jì)變化或不穩(wěn)定之處,分配職責(zé)用以在這些變化之外創(chuàng)建穩(wěn)定接口例子外部稅金計(jì)算器問題西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.2.4防止變異(Cont.)討論P(yáng)V時(shí)非常重要和基本的軟件設(shè)計(jì)原則。許多軟件或架構(gòu)設(shè)計(jì)技巧都是防止變異的特例Dataencapsulation,interfaces,polymorphism,indirection…Data-drivendesignsSOA…禁忌如果需要靈活性和對變化的預(yù)防,那么就應(yīng)用PV如果預(yù)測將來驗(yàn)證或者預(yù)測“復(fù)用”的可能性并不確定,則需要有克制和批評的態(tài)度西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.2.4防止變異(Cont.)初學(xué)者傾向于脆弱的設(shè)計(jì)而中等程度的開發(fā)者則傾向于過度想象的,靈活的,一般化的設(shè)計(jì)專家開發(fā)者理智地進(jìn)行選擇優(yōu)點(diǎn)易于增加新變化所需的擴(kuò)展可以引入新的實(shí)現(xiàn)而無需影響客戶低耦合能夠降低變化的成本或影響西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.3Gang-of-Four模式DesignPatterns,作為一本非常著名的書,是由四位作者寫的,因此我們使用“Gang-of-Four”適配器(Adapter)工廠(
Factory)單實(shí)例類(
Singleton)策略(Strategy)組合模式(CompositePattern)外觀(Facade)觀察者/發(fā)布-訂閱/委派事件模型西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.3.1適配器Adapter(GOF)問題如何解決不相容的接口問題,或者如何為具有不同接口的類似構(gòu)件提供穩(wěn)定的接口?解決方案通過中介適配器對象,將構(gòu)件的原來的接口轉(zhuǎn)換為其它接口多態(tài)模式就是該模式的例子AdaptersuseinterfacesandpolymorphismtoaddalevelofindirectiontovaryingAPIsinothercomponents.TaxMasterAdaptergetTaxes(Sale):ListofTaxLineItemsGoodAsGoldTaxProAdaptergetTaxes(Sale):ListofTaxLineItems<<interface>>ITaxCalculatorAdaptergetTaxes(Sale):ListofTaxLineItemsSAPAccountingAdapterpostReceivable(CreditPayment)postSale(Sale)...GreatNorthernAccountingAdapterpostReceivable(CreditPayment)postSale(Sale)...<<interface>>IAccountingAdapterpostReceivable(CreditPayment)postSale(Sale)...<<interface>>IInventoryAdapter...<<interface>>ICreditAuthorizationServiceAdapterrequestApproval(CreditPayment,TerminalID,MerchantID)...:Register:SAPAccountingAdapterpostSale(sale)makePayment()theAdapteradaptstointerfacesinothercomponents<<system>>:SAPSOAPoverHTTPxxx...IAccountingAdapterUMLnotationtoindicatesomethingimplementsaparticularinterface西安郵電學(xué)院計(jì)算機(jī)系舒新峰Adapter
模式的應(yīng)用是對GRASP構(gòu)造塊的特殊化(polymorphism,indirectionandprotectedvariations)可以找到數(shù)百種模式的說明理解本質(zhì)能夠使我們摒棄太多細(xì)節(jié)西安郵電學(xué)院計(jì)算機(jī)系舒新峰兩個(gè)問題命名習(xí)慣:將模式名字放在類型中設(shè)計(jì)中發(fā)現(xiàn)的“分析”
:領(lǐng)域模型西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.3.2工廠Factory(GoF)問題在適配器模式中,對外部服務(wù)有不同的接口,那么是誰創(chuàng)建了這些適配器,并且如何決定創(chuàng)建哪種類的適配器當(dāng)有特殊考慮(例如存在復(fù)雜創(chuàng)建邏輯,為了改良內(nèi)聚而分離創(chuàng)建職責(zé)等)時(shí),應(yīng)該由誰來負(fù)責(zé)創(chuàng)建對象?解決方案創(chuàng)建稱為工廠的純虛構(gòu)對象來處理這些創(chuàng)建職責(zé)ServicesFactoryaccountingAdapter:IAccountingAdapterinventoryAdapter:IInventoryAdaptertaxCalculatorAdapter:ITaxCalculatorAdaptergetAccountingAdapter():IAccountingAdaptergetInventoryAdapter():IInventoryAdaptergetTaxCalculatorAdapter():ITaxCalculatorAdapter...notethatthefactorymethodsreturnobjectstypedtoaninterfaceratherthanaclass,sothatthefactorycanreturnanyimplementationoftheinterface{
if(taxCalculatorAdapter==null)
{
//areflectiveordata-drivenapproachtofindingtherightclass:readitfroman
//externalproperty
StringclassName=System.getProperty("");
taxCalculatorAdapter=(ITaxCalculatorAdapter)Class.forName(className).newInstance();
}
returntaxCalculatorAdapter;}ItmaylessentheneedforinteractiondiagramData-drivendesign西安郵電學(xué)院計(jì)算機(jī)系舒新峰優(yōu)點(diǎn)分離復(fù)雜的創(chuàng)建職責(zé),并將其分配給內(nèi)聚的幫助者對象隱藏潛在的復(fù)雜創(chuàng)建邏輯允許引入提高性能的內(nèi)存管理策略,例如對象緩存或再生西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.3.3單實(shí)例類Singleton問題誰來創(chuàng)建工廠自身?如何訪問工廠?將實(shí)例作為一個(gè)參數(shù)進(jìn)行傳遞對那些需要可見性的對象在初始化時(shí)賦予一個(gè)持久引用單實(shí)例模式:只允許類的一個(gè)實(shí)例:這是一個(gè)單實(shí)例。對象需要一個(gè)全局和唯一的訪問點(diǎn).解決方案對類定義靜態(tài)方法用以返回單實(shí)例
1ServicesFactoryinstance:ServicesFactoryaccountingAdapter:IAccountingAdapterinventoryAdapter:IInventoryAdaptertaxCalculatorAdapter:ITaxCalculatorAdaptergetInstance():ServicesFactorygetAccountingAdapter():IAccountingAdaptergetInventoryAdapter():IInventoryAdaptergetTaxCalculatorAdapter():ITaxCalculatorAdapter...singletonstaticattributesingletonstaticmethod{//staticmethodpublicstaticsynchronizedServicesFactorygetInstance(){if(instance==null)
instance:=newServicesFactory()returninstance}}UMLnotation:inaclassbox,anunderlined
attributeormethodindicatesastatic(classlevel)member,ratherthananinstancememberUMLnotation:this'1'canoptionallybeusedtoindicatethatonlyoneinstancewillbecreated(asingleton)LazyinitializationCreationworkisavoided,iftheinstanceisneveractuallyaccessedThegetInstancelazyinitializationsometimescontainscomplexandconditionalcreationlogic西安郵電學(xué)院計(jì)算機(jī)系舒新峰開發(fā)人員通過類的靜態(tài)方法getInstance
得到其唯一實(shí)例的全局可見性publicclassRegister{publicvoidinitialize(){…dosomework…//accessingthesingletonFactoryviathegetInstancecall
accountingAdapter=ServiceFactory.getInstance().getAccountingAdapter();…dosomework…}//othermtehods..}西安郵電學(xué)院計(jì)算機(jī)系舒新峰UMLnotation:Register<<Singleton>>:ServicesFactoryaa:=getAccountingAdapter()initialize()...aUMLstereotypecanindicatethatvisibilitytothisinstancewasachievedviatheSingletonpattern西安郵電學(xué)院計(jì)算機(jī)系舒新峰具有不同接口的外部服務(wù)問題的結(jié)論使用適配器,工廠和單實(shí)例類模式的結(jié)合,為具有不同接口的外部稅金計(jì)算器,財(cái)務(wù)系統(tǒng)等提供防止變異:RegisteraccountingAdapter:SAPAccountingAdapterpostSale(sale)makePayment()<<System>>:SAPSOAPoverHTTPxxxIAccountingAdapter:Register<<singleton>>:ServicesFactoryaccountingAdapter:=
getAccountingAdapter():Storecreate()create()[instance==null]create():SAPAccountingAdapterIAccountingAdapter:Paymentcreate(cashTendered)西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.3.4策略(Strategy)問題提供更為復(fù)雜的定價(jià)邏輯,例如商店在某天的折扣,老年人折扣等如何設(shè)計(jì)變化但相關(guān)的算法或政策?如何設(shè)計(jì)才能使這些算法或政策具有可變更的能力解決方案在單獨(dú)的類中分別定義每種算法/政策/策略,并且使其具有共同接口西安郵電學(xué)院計(jì)算機(jī)系舒新峰例子PercentDiscountPricingStrategypercentage:floatgetTotal(s:Sale):MoneyAbsoluteDiscountOverThresholdPricingStrategydiscount:Moneythreshold:MoneygetTotal(s:Sale):Money<<interface>>ISalePricingStrategygetTotal(Sale):Money{
returns.getPreDiscountTotal()*percentage}???PricingStrategy......{pdt:=s.getPreDiscountTotal()if(pdt<threshold)
returnpdtelse
returnpdt-discount}西安郵電學(xué)院計(jì)算機(jī)系舒新峰:PercentDiscountPricingStrategyISalePricingStrategys:Sale*:st:=getSubtotal()t:=getTotal():SalesLineItem:SalesLineItemt:=getTotal(s)pdt:=getPreDiscountTotal(){t=pdt*percentage}notethattheSalesispassedtotheStrategysothatithasparametervisibilitytoitforfurthercollaboration西安郵電學(xué)院計(jì)算機(jī)系舒新峰語境對象需要其策略的屬性可見性PercentDiscountPricingStrategypercentage:floatgetTotal(Sale):MoneyAbsoluteDiscountOverThresholdPricingStrategydiscount:Moneythreshold:MoneygetTotal(Sale):Money<<interface>>ISalePricingStrategygetTotal(Sale):MoneySaledate...getTotal()...1*SaleneedsattributevisibilitytoitsStrategypricingStrategygetTotal(){...returnpricingStrategy.getTotal(this)}西安郵電學(xué)院計(jì)算機(jī)系舒新峰使用工廠創(chuàng)建策略
1PricingStrategyFactoryinstance:PricingStrategyFactorygetInstance():PricingStrategyFactorygetSalePricingStrategy():ISalePricingStrategygetSeniorPricingStrategy():ISalePricingStrategy...{
StringclassName=System.getProperty("");
strategy=(ISalePricingStrategy)Class.forName(className).newInstance();
returnstrategy;}Becauseofthefrequentlychangingpricingpolicyre-createoneeachtime西安郵電學(xué)院計(jì)算機(jī)系舒新峰:Sale<<singleton>>:PricingStrategyFactoryps:=getSalePricingStrategy():RegistermakeNewSale()create()create(percent)ps:PercentDiscountPricingStrategyISalePricingStrategy西安郵電學(xué)院計(jì)算機(jī)系舒新峰讀取和初始化百分比值如何確定百分比或絕對值折扣的數(shù)值?這些數(shù)據(jù)將保存于某種外部數(shù)據(jù)存儲(chǔ)中以便修改哪個(gè)對象讀取這些數(shù)據(jù),并確保將其分配給相應(yīng)的策略?StrategyFactory
從外部數(shù)據(jù)源中讀取數(shù)字的方法通過對其變化進(jìn)行分析后來確定3.5組合模式(CompositePattern)西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.3.5組合模式(CompositePattern)問題如何處理多個(gè)互相沖突的定價(jià)策略?老年人20%的折扣對于購物金額滿400元的優(yōu)先客戶給與折15%的折扣在星期一,購物金額滿500元的享受50元的折扣買一罐印度大吉嶺茶,則所有購買物品都享受15%的折扣解決方案為復(fù)合和原子對象定義一個(gè)類,以使他們實(shí)現(xiàn)相同的接口西安郵電學(xué)院計(jì)算機(jī)系舒新峰解決沖突的策略對顧客最有利或者對商場最有利定價(jià)策略可能與產(chǎn)品類型相關(guān),也可能與客戶類型相關(guān),這意味著:StrategyFactory
必須知道客戶和產(chǎn)品的類型如何能夠像處理非組合(原子)對象一樣,(多態(tài)地)處理一組對象或具有組合結(jié)構(gòu)的對象呢?西安郵電學(xué)院計(jì)算機(jī)系舒新峰PercentageDiscountPricingStrategypercentage:floatgetTotal(Sale):MoneyAbsoluteDiscountOverThresholdPricingStrategydiscount:Moneythreshold:MoneygetTotal(Sale):Money<<interface>>ISalePricingStrategygetTotal(Sale):Money{
returnsale.getPreDiscountTotal()*percentage}CompositePricingStrategyadd(ISalePricingStrategy)getTotal(Sale):Money{lowestTotal=INTEGER.MAXforeachISalePricingStrategystratinpricingStrategies
{
total:=strat.getTotal(sale)
lowestTotal=min(total,lowestTotal)
}returnlowestTotal}1..*CompositeBestForCustomerPricingStrategygetTotal(Sale):MoneyCompositeBestForStorePricingStrategygetTotal(Sale):MoneypricingStrategiesAllcompositesmaintainalistofcontainedstrategies.Therefore,defineacommonsuperclassCompositePricingStrategythatdefinesthislist(namedpricingStrategies).Saledate...getTotal()...1*pricingStrategy{...returnpricingStrategy.getTotal(this)}Theoutercompositeobjectcontainsalistofinnerobjectsandboththeouterandinnerobjectsimplementthesameinterface西安郵電學(xué)院計(jì)算機(jī)系舒新峰positeBestForCustomerPricingStrategyISalePricingStrategys:Sale*:st:=getSubtotal()t:=getTotal():SalesLineItem:SalesLineItemt:=getTotal(s)theSaleobjecttreatsaCompositeStrategythatcontainsotherstrategiesjustlikeanyotherISalePricingStrategy*:x:=getTotal(s):SalesLineItem:ObjectISalePricingStrategyUMLnotation:thisisawaytoindicateobjectsthatimplementsomeinterface,whenwedon'twanttodeclarewhatthespecificimplementationclassesare{t=min(setofallx)}西安郵電學(xué)院計(jì)算機(jī)系舒新峰創(chuàng)建多個(gè)SalePricingStrategies什么時(shí)候創(chuàng)建這些策略呢?在情形中有三個(gè)地方可以將定價(jià)策略加入到符合對象中:目前商店定義的折扣,可以在銷售對象創(chuàng)建時(shí)添加顧客類型的折扣,可以在POS機(jī)獲取顧客類型時(shí)添加產(chǎn)品類型的折扣(ifboughtDarjeelingtea,15%offtheoverallsale),可以在產(chǎn)品輸入到銷售中時(shí)添加西安郵電學(xué)院計(jì)算機(jī)系舒新峰:Sale<<singleton>>:PricingStrategyFactoryps:=getSalePricingStrategy():RegistermakeNewSale()create()create()pspositeBestForCustomerPricingStrategyISalePricingStrategycreate(percent)s:PercentageDiscountPricingStrategyISalePricingStrategyadd(s)西安郵電學(xué)院計(jì)算機(jī)系舒新峰對于客戶類型折扣的第二種情形UseCaseUC1:ProcessSale…擴(kuò)展(orAlternativeFlows):5b.Customersaystheyareeligibleforadiscount(e.g.,employee,preferredcustomer)1.Cashiersignalsdiscountrequest2.CashierentersCustomeridentification3.Systempresentsdiscounttotal,basedondiscountrules西安郵電學(xué)院計(jì)算機(jī)系舒新峰s:Sale:RegisterenterCustomerForDiscount(custID)byControllerbyExpertandIDstoObjects:Storec:=getCustomer(custID)enterCustomerForDiscount(c:Customer)continuedinanotherdiagrambyExpert西安郵電學(xué)院計(jì)算機(jī)系舒新峰s:Sale<<singleton>>:PricingStrategyFactoryaddCustomerPricingStrategy(s)pspositeBestForCustomerPricingStrategyISalePricingStrategycreate(pct)s:PercentageDiscountPricingStrategyISalePricingStrategyadd(s)byExpertenterCustomerForDiscount(c:Customer)originatesinanotherdiagramc:=getCustomer()byFactoryandHighCohesionbyExpertps:=getPricingStrategy()pct:=getCustomerPercentage(c)byHighCohesionbyFactoryandCompositePassAggregateObjectasParameter西安郵電學(xué)院計(jì)算機(jī)系舒新峰兩個(gè)通用實(shí)踐IDs到對象Acommonpracticeinobjectdesign-totransformkeysandIDsforthingsintotrueobjectsTransformthecustomerIDintoaCustomerobject將聚集對象作為參數(shù)addCustomerPricingStrategy(s:Sale)messagewepassaSaletothefactory,andthenthefactoryturnsaroundandasksfortheCustomerandPricingStrategyfromtheSale西安郵電學(xué)院計(jì)算機(jī)系舒新峰3.6外觀(Facade)問題可插拔的業(yè)務(wù)規(guī)則創(chuàng)建新銷售時(shí),可能要識別該銷售是否以禮券方式進(jìn)行支付。商店可能會(huì)規(guī)定如果使用禮券只可以購買一件商品。如果銷售使用禮券支付,在對該顧客找零時(shí),除了禮券之外所有其它支付類型的找零都應(yīng)該置為無效。例如,如果收銀員請求現(xiàn)金找零或更新顧客在其商店帳戶上的積分時(shí),這些請求都應(yīng)該判斷為無效….如何設(shè)計(jì)一個(gè)軟件對目前的軟件組件影響最小呢?西安郵電學(xué)院計(jì)算機(jī)系舒新峰解決方案定義對子系統(tǒng)的單一的接觸點(diǎn)-用一個(gè)外觀對象包裝子系統(tǒng)。外觀對象提供了一個(gè)唯一的統(tǒng)一接口,它負(fù)責(zé)與子系統(tǒng)的組件進(jìn)行協(xié)作西安郵電學(xué)院計(jì)算機(jī)系舒新峰子系統(tǒng)的外觀對象被稱為POSRuleEngineFacade.設(shè)計(jì)者決定在所有定義了可插拔規(guī)則的方法的開始之處調(diào)用這一外觀publicclassSale{publicvoidmakeLineItem(ProductSpecificationspec,intquantity){SalesLineItemsli=newSalesLineItem(spec,quantity);//calltotheFa?adeif(POSRuleEngineFacade.getInstance().isInvalid(sli,this))return;linItems.add(sli);}//…}//endofclass西安郵電學(xué)院計(jì)算機(jī)系舒新峰Domain+Sale+Register...POSRuleEngine<<interface>>-IRule...-Rule1...-Rule2......packagenamemaybeshowninthetabvisibilityofthepackageelement(tooutsidethepackage)canbeshownbyprecedingtheelementnamewithavisibilitysymbol+POSRuleEngineFacadeinstance:RuleEngineFacadegetInstance():RuleEngineFacadeisInvalid(SalesLineItem,Sale)isInvalid(Payment,Sale)...*1西安郵電學(xué)院計(jì)算機(jī)系舒新峰外觀一般通過單實(shí)例模式來訪問外觀vs.適配器適配器對外部系統(tǒng)的訪問進(jìn)行了封裝,盡管它是一種外觀,它強(qiáng)調(diào)的是對各種接口的兼容性西安郵電學(xué)院計(jì)算機(jī)系舒新峰10.3.7觀察者/發(fā)布-訂閱/委派事件模型添加當(dāng)總價(jià)變化時(shí),GUI窗口能夠更新其顯示的能力Goal:Whenthetotalofthesalechanges,refreshthedisplaywiththenewvalueSaletotal...setTotal(newTotal)...Solution1:WhentheSalechangesthetotal,theSaleobjectsendsamessagetoawindow,askingittorefreshitsdisplayViolationofModel-ViewSeparationPrinciple西安郵電學(xué)院計(jì)算機(jī)系舒新峰解決方案定義一個(gè)“訂閱”
or“聆聽者”接口.訂閱者實(shí)現(xiàn)該接口。發(fā)布者可以動(dòng)態(tài)的注冊對事件感興趣的訂閱者,并在事件發(fā)生時(shí),通知它們。西安郵電學(xué)院計(jì)算機(jī)系舒新峰<<interface>>PropertyListeneronPropertyEvent(source,name,value)SaleFrame1onPropertyEvent(source,name,value)initialize(Salesale)...javax.swing.JFrame...setTitle()setVisible()...{
if(name.equals("sale.total"))
saleTextField.setText(value.toString());}SaleaddPropertyListener(PropertyListenerlis)publishPropertyEvent(name,value)setTotal(MoneynewTotal)...*propertyListeners{
total=newTotal;
publishPropertyEvent("sale.total",total);
}{
propertyListeners.add(lis);}{
foreachPropertyListenerplinpropertyListeners
pl.onPropertyEvent(this,name,value);
}{
sale.addPropertyListener(this)
...}西安郵電學(xué)院計(jì)算機(jī)系舒新峰s:Salesf:SaleFrame1initialize(s:Sale)addPropertyListener(sf)PropertyListenerpropertylisteners:Objectadd(sf)PropertyListenerUMLnotation:Recallthatthereisnosuchthingasaninstanceofaninterface.Therefore,wecangeneralize(orbevague)andsimplyindicatetheinstancesastypeObject,whichisassumedtobethesuperclassofallclasses.Thisapproachcanbeusedevenifthelanguage(suchasC++)do
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版家畜養(yǎng)殖保險(xiǎn)產(chǎn)品定制及銷售合同3篇
- 2025年度智能門禁系統(tǒng)與消防報(bào)警系統(tǒng)聯(lián)動(dòng)合同4篇
- 二零二五版跨境電商運(yùn)營服務(wù)戰(zhàn)略合作協(xié)議3篇
- 2025年度新型門窗及欄桿研發(fā)與生產(chǎn)合作協(xié)議4篇
- 2025年高端個(gè)人財(cái)富管理代客理財(cái)協(xié)議3篇
- 2025年度個(gè)人經(jīng)營性貸款擔(dān)保保證合同3篇
- 2025版綠色建筑地坪材料供應(yīng)合同3篇
- 2025年度共享經(jīng)濟(jì)門面房租賃與平臺(tái)建設(shè)合同3篇
- 個(gè)人汽車購買資助合同2024年模板版B版
- XX市重點(diǎn)蓄水池施工合作合同版
- 2025水利云播五大員考試題庫(含答案)
- 中藥飲片驗(yàn)收培訓(xùn)
- DB34T 1831-2013 油菜收獲與秸稈粉碎機(jī)械化聯(lián)合作業(yè)技術(shù)規(guī)范
- 創(chuàng)傷處理理論知識考核試題及答案
- 稅前工資反算表模板
- 2019級水電站動(dòng)力設(shè)備專業(yè)三年制人才培養(yǎng)方案
- 肝素誘導(dǎo)的血小板減少癥培訓(xùn)課件
- 抖音認(rèn)證承諾函
- 高等數(shù)學(xué)(第二版)
- 四合一體系基礎(chǔ)知識培訓(xùn)課件
- ICD-9-CM-3手術(shù)與操作國家臨床版亞目表
評論
0/150
提交評論