版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、設(shè)計(jì)模式1 2 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)適配器模式GoF工廠模式GoF單子模式GoF策略模式GoF組合模式GoF外觀模式GoF觀察者/發(fā)布訂閱/委托事件模式GoF1.適配器模式在POS系統(tǒng)中,需要和多個(gè)外部系統(tǒng)交互庫(kù)存系統(tǒng)、稅金計(jì)算器、賬務(wù)系統(tǒng)等。以使用第三方稅金計(jì)算器為例使用A計(jì)算器TaxA atax= new TaxA();TaxA.tax(,);使用B計(jì)算器TaxB atax= new TaxB();TaxB.getTax(,);代碼中有兩個(gè)容易變化的地方:計(jì)算器的類名、計(jì)算器提供的方法名2。使用適配器來屏蔽接口的差異 class TaxAdaptor TaxA tax=new
2、TaxA(); float getTaxes() return tax.tax(); 3。代碼變?yōu)門axAdaptor adaptor ;adaptor =new TaxAAdaptor();adaptor.getTaxes(.); TaxBdaptor adaptor ;adaptor =new TaxBAdaptor();adaptor.getTaxes(.);接口統(tǒng)一了,但是代碼還是和具體的類耦合!繼續(xù)想方法!4。創(chuàng)立適配器的抽象來屏蔽不同的適配器ITaxCalculatorAdaptor adaptor ;adaptor =new TaxAAdaptor();adaptor.getTa
3、xes(.); ITaxCalculatorAdaptor adaptor ;adaptor =new TaxBAdaptor();adaptor.getTaxes(.); 現(xiàn)在,就剩紅色字體處要出來啦繼續(xù)想方法! 6 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)1.適配器模式問題:如何解決接口不兼容的問題或?yàn)椴煌涌诘嗨频慕M件提供一個(gè)穩(wěn)定的接口?解決方案:通過一個(gè)中間的適配器對(duì)象將組件的原來接口轉(zhuǎn)換為另一個(gè)接口。4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)-適配器模式適配器模式類圖 7 8 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)-適配器模式SAPAccountingAdaptor負(fù)責(zé)將postSale接口適配成外部效勞
4、的接口clientAdapterAdaptee有一個(gè)類(adaptee)實(shí)現(xiàn)了數(shù)學(xué)中的冪次運(yùn)算,方法中需要傳入兩個(gè)參數(shù),一個(gè)是基數(shù)base,另外一個(gè)是冪次exp?,F(xiàn)在客戶端需要一個(gè)求得一個(gè)數(shù)的平方的函數(shù)接口(target),傳入一個(gè)數(shù),得到它的平方值。請(qǐng)應(yīng)用適配器模式進(jìn)行設(shè)計(jì),繪制類圖。 9 10 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)2工廠模式2.工廠模式考慮:在前面外部效勞適配器解決方案中,誰(shuí)去負(fù)責(zé)創(chuàng)立這些適配器?誰(shuí)去確定要?jiǎng)?chuàng)立的是哪個(gè)適配器,是TaxMasterAdapter 還是GoodAsGoldTaxProAdapter?讓領(lǐng)域類如Sale來創(chuàng)立適配器對(duì)象是否適宜?-如此那么領(lǐng)域類不只是
5、包含應(yīng)用邏輯了!一個(gè)設(shè)計(jì)原那么:設(shè)計(jì)要保證別離不相關(guān)的事物。別離不同的事物到不同的領(lǐng)域,從而使得別離的各局部能到達(dá)高內(nèi)聚的設(shè)計(jì)目標(biāo)。5。應(yīng)用工廠模式來屏蔽具體適配器ITaxCalculatorAdaptor adaptor;ServiceFactory factory=new ServiceFactory();adaptor =factory.getTaxCalculatorAdaptor();adaptor.getTaxes(.); 現(xiàn)在,代碼徹底和具體的適配器類無關(guān)啦6。工廠中如何與具體適配器類解耦1具體用哪個(gè)適配器?用屬性來記錄System.setProperty(name,zhouch
6、unyan)System.setProperty(ITaxCalculatorA, TaxAAdaptor);2工廠中的getTaxCalculatorAdaptor與具體適配器解耦I(lǐng)TaxCalculatorAdaptor getTaxCalculatorAdaptor() if(taxCalculatorAdaptor=null) String className=System.getProperty(ITaxCalculatorA); taxCalculatorAdaptor=Class.forname(classNam
7、e).newinstance() return taxCalculatorAdaptor; 13 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)2工廠模式問題:當(dāng)考慮某些特殊情況時(shí),如復(fù)雜的創(chuàng)立邏輯、希望別離創(chuàng)立職責(zé)以產(chǎn)生更好的內(nèi)聚度等,誰(shuí)應(yīng)該負(fù)責(zé)創(chuàng)立對(duì)象?解決方案:創(chuàng)立一個(gè)名為工廠的純虛構(gòu)對(duì)象來處理創(chuàng)立。工廠類ServiceFactory負(fù)責(zé)創(chuàng)立第三方財(cái)務(wù)適配器、庫(kù)存適配器、稅金計(jì)算器。if ( taxCalculatorAdapter = null ) /創(chuàng)立某一稅率計(jì)算器對(duì)象賦值給 /taxCalculatorAdapter ; return taxCalculatorAdapter;返回值類型?類型
8、?getTaxCalculatorAdapter() : 返回類型是TaxMasterAdaptor還是 GoodAsGoldTaxProAdaptor?還是 14 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)2工廠模式注意:工廠方法返回對(duì)象的類型是接口,而不是類,這樣工廠方法就可以返回接口的任何實(shí)現(xiàn)。注意:在serviceFactory中,決定哪個(gè)類的實(shí)例被初始化是從外部數(shù)據(jù)源讀入類名如在java中可使用系統(tǒng)屬性,然后動(dòng)態(tài)裝載此類來實(shí)現(xiàn)的。 if(taxCalculatorAdaptor=null) String className=System.getProperty(taxCalculator.cl
9、); taxCalculatorAdaptor= (ITaxCalculatorAdaptor)Class.forName(className).newInstance(); return taxCalculatorAdaptor; 15 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)2工廠模式補(bǔ)充依賴倒置原那么(DIP)告訴我們應(yīng)該優(yōu)先依賴于抽象類,而防止依賴于具體類。當(dāng)這些具體類不穩(wěn)定時(shí),更應(yīng)該如此。因此,下面的代碼違反了這個(gè)原那么Circle c = new Circle(); 16 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)2工廠模式改進(jìn):工廠模式允許我們只依賴于抽象接口就能創(chuàng)立出具體類的實(shí)例
10、。public interface ShapeFactory public Shape make(String shapeName) throws Exception; 17 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)2工廠模式public class ShapeFactoryImplementation implements ShapeFactory public Shape make(String shapeName) throws Exception if (shapeName.equals(Circle) return new Circle(); else if (shapeName.equal
11、s(Square) return new Square(); else throw new Exception(ShapeFactory cannot create + shapeName); 18 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)3單子模式3.單子模式誰(shuí)創(chuàng)立工廠類?如何訪問此類?事實(shí):整個(gè)程序只需要一個(gè)工廠類的實(shí)例;由于代碼在不同的地方需要訪問適配器以調(diào)用外部系統(tǒng)的效勞,所以工廠類的方法也需要在代碼的多個(gè)地方被調(diào)用。問題:一個(gè)類X只能有一個(gè)實(shí)例這就是“單子的含義)。對(duì)象需要全局的可見性和單一的訪問點(diǎn)。解決方案:為類X定義靜態(tài)方法getInstance,該方法返回X的唯一實(shí)例。因?yàn)槭庆o態(tài)方法,
12、所以可以全局訪問,且該類的構(gòu)造方法可見性設(shè)為私有private。 19 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)3單子模式/單子方法getlnstance返回工廠類的唯一實(shí)例public static synchronized ServicesFactory getlnstance() if ( instance = null ) instance = new ServicesFactory(); return instance; 20 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)3單子模式Synchronized解釋:?jiǎn)巫宇惖膅etInstance方法經(jīng)常被調(diào)用,在多線程MultiThread的應(yīng)用程序里,在某
13、一客戶端線程調(diào)用getInstance方法前,必須先把該方法鎖住,以防止其他客戶端調(diào)用該方法;當(dāng)方法調(diào)用完畢后,再把鎖翻開,讓其他客戶端線程可以調(diào)用該方法。從而實(shí)現(xiàn)線程的并發(fā)控制。 21 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)3單子模式public class Register IAccountingAdapter accountingAdapter; public void initialize() do some work . accountingAdapter = ServicesFactory.getlnstance().getAccountingAdapter(); do some wor
14、k . / other methods. ServicesFactory具有全局可見性Register對(duì)工廠類的調(diào)用: 22 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)3單子模式ServicesFactory.getlnstance().getAccountingAdapter();通過單子模式得到該實(shí)例的可見性 23 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)外部接口變化的解決方案register向外部SAP財(cái)務(wù)系統(tǒng)發(fā)送PostSaleregister從工廠類中獲取針對(duì)SAP財(cái)務(wù)系統(tǒng)的適配器SAPAccountingAdaptor;Register向SAPAccountingAdaptor發(fā)送PostSale消
15、息,由適配器將消息適配后轉(zhuǎn)發(fā)給外部SAP財(cái)務(wù)系統(tǒng)。請(qǐng)畫出以上交互的順序圖 24 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)外部接口變化的解決方案適配器模式、多態(tài)模式、工廠模式、單子模式的綜合運(yùn)用 25 目的:實(shí)現(xiàn)復(fù)雜的定價(jià)規(guī)那么。商店的定價(jià)策略可能變化。對(duì)變化的定價(jià)算法我們應(yīng)如何設(shè)計(jì)?策略模式語(yǔ)境/問題:如何對(duì)變化或與變化相關(guān)的算法或策略進(jìn)行設(shè)計(jì)?如何設(shè)計(jì)系統(tǒng)使得其具有改變算法或策略的能力?解決方案:在單獨(dú)的類中分別定義每種算法、策略和政策,并且使其具有公共接口。4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)4策略模式 26 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)4策略模式用多態(tài)屏蔽變化一種策略對(duì)應(yīng)于一個(gè)類 27 4 用G
16、oF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)4策略模式策略對(duì)象依附于語(yǔ)境對(duì)象,策略對(duì)象對(duì)其應(yīng)用算法。本例中Sale是語(yǔ)境對(duì)象。當(dāng)getTotal消息發(fā)給Sale時(shí),它會(huì)把局部工作委派給它的策略對(duì)象。通常,發(fā)給語(yǔ)境對(duì)象的消息和發(fā)給策略對(duì)象的消息會(huì)同名。語(yǔ)境對(duì)象會(huì)把自身的引用傳遞給策略對(duì)象,使得策略對(duì)象對(duì)語(yǔ)境對(duì)象擁有參數(shù) 可見性,便于將來的協(xié)作。調(diào)用策略對(duì)象獲取折扣后總價(jià)格 28 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)4策略模式語(yǔ)境對(duì)象需要其策略對(duì)象的屬性可見性Sale需要其策略的屬性可見性注意:Sale和ISalePricingStrategy接口關(guān)聯(lián),而不是和具體策略類關(guān)聯(lián)。這就可以使接口的任何實(shí)現(xiàn)都可以與Sale的p
17、ricingStrategy屬性綁定。對(duì)象如何獲取策略對(duì)象的可見性 29 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)4策略模式誰(shuí)來負(fù)責(zé)創(chuàng)立策略對(duì)象:工廠類出于內(nèi)聚的考慮,創(chuàng)立專門用于生成策略對(duì)象的工廠類:PricingStrategyFactory注意:策略工廠不需要緩存策略類的實(shí)例,因?yàn)椴呗允墙?jīng)常變化的。應(yīng)該在每次要用的時(shí)候進(jìn)行實(shí)例化。對(duì)象如何獲取策略對(duì)象的可見性 30 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)4策略模式在sale的初始化時(shí)獲取策略對(duì)象的引用對(duì)象如何獲取策略對(duì)象的可見性 31 示意代碼:Public class sale ISalePricingStrategy ps; public sale
18、()/構(gòu)造方法 psPricingStrategyFactory.getInstance(). getSalePricingStrategy Public Money getTotal /計(jì)算折扣前的各saleLineItem銷售價(jià)格總和; return ps.getTotal(this;/代碼只和接口打交道 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)4策略模式練習(xí):假設(shè)現(xiàn)在要設(shè)計(jì)一個(gè)販賣各類書籍的電子商務(wù)網(wǎng)站的購(gòu)物車系統(tǒng)。對(duì)所有的教材類圖書實(shí)行每本一元的折扣;對(duì)連環(huán)畫類圖書提供每本7%的促銷折扣;而對(duì)非教材類的計(jì)算機(jī)圖書有3%的折扣;對(duì)其余書沒有折扣。請(qǐng)應(yīng)用策略模式進(jìn)行設(shè)計(jì),繪制類圖 32 33 34
19、 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)5組合模式現(xiàn)實(shí)情況:一次銷售可能有多個(gè)定價(jià)策略;定價(jià)策略與顧客類型有關(guān)如高級(jí)會(huì)員;定價(jià)策略可能和所購(gòu)置商品的類型有關(guān)如Darjeerling茶面臨問題是否存在一種方式,可以改變?cè)O(shè)計(jì),使得Sale對(duì)象不知道是一個(gè)還是多個(gè)定價(jià)策略與其關(guān)聯(lián),并同時(shí)提供一種設(shè)計(jì)來解決定價(jià)策略沖突? 35 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)5組合模式組合模式語(yǔ)境/問題:如何象對(duì)待原子對(duì)象一樣對(duì)一組對(duì)象或?qū)ο蟮慕M合結(jié)構(gòu)做同樣多態(tài)的處理?解決方案:定義組合對(duì)象和原子對(duì)象的類,使得他們實(shí)現(xiàn)同樣的接口。 36 組合模式的一般形式原子對(duì)象組合對(duì)象 37 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)5組合模式組
20、合對(duì)象的顯著特征:組合對(duì)象包含一系列原子對(duì)象,這兩類對(duì)象實(shí)現(xiàn)相同的接口。對(duì)Sale附加的策略既可以是組合策略,又可以是原子策略,而Sale不用去關(guān)心到底是哪類策略。組合類strategies 38 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)5組合模式要解決的關(guān)鍵問題:Sale如何獲取組合策略對(duì)象的引用?組合策略對(duì)象由誰(shuí)創(chuàng)立?Sale發(fā)消息給組合策略對(duì)象時(shí),組合策略對(duì)象如何進(jìn)一步調(diào)用簡(jiǎn)單策略對(duì)象來計(jì)算銷售折扣后總價(jià)格? 39 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)5組合模式存放簡(jiǎn)單策略將簡(jiǎn)單策略參加組合策略中1. 抽象類CompositePricingStrategy的定義 40 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)
21、現(xiàn)5組合模式2.子類CompositeBestForCustomerPricingStrategy的定義 41 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)5組合模式獲取CompositeBestForCustomerPricingStrategy的引用在sale初始化時(shí)由策略工廠創(chuàng)立一個(gè)組合策略,并創(chuàng)立簡(jiǎn)單策略加到組合策略里;而sale并不清楚使用的是簡(jiǎn)單策略還是組合策略。在sale的getTotal方法中調(diào)用組合策略計(jì)算折扣后總價(jià)。 42 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)5組合模式4.調(diào)用組合策略獲取銷售折扣后總價(jià)格 42 43 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)5組合模式import java.uti
22、l.Vector;public class CompositeShape implements Shape private Vector itsShapes = new Vector(); public void add(Shape s) itsShapes.add(s); public void draw() for (int i = 0; i itsShapes.size(); i+) Shape shape = (Shape) itsShapes.elementAt(i); shape.draw(); 組合模式應(yīng)用舉例圖形可能是Square、Circle或者由Square和Circle組
23、成的復(fù)合圖形 44 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)6外觀模式外觀模式引言:學(xué)校的財(cái)務(wù)處有不同的科室,每一個(gè)科室辦理專門的業(yè)務(wù)。當(dāng)我們辦理不同的業(yè)務(wù)時(shí),必須先調(diào)查清楚到哪個(gè)科室去辦,而且科室內(nèi)的業(yè)務(wù)有辦理流程,往往先得辦這項(xiàng)任務(wù),才能辦下一項(xiàng)任務(wù)。如果某一個(gè)科室的某項(xiàng)業(yè)務(wù)被轉(zhuǎn)移到其他科室去辦理,如果我們事先不清楚這一變化,那可能找不到去哪辦理這項(xiàng)業(yè)務(wù)。所以,去財(cái)務(wù)處辦事不方便!而如果財(cái)務(wù)處設(shè)立一個(gè)接待員,我們只需要和接待員交互,接待員再和內(nèi)部財(cái)務(wù)處人員交互,那么問題會(huì)變得非常簡(jiǎn)單。 45 同樣的,系統(tǒng)中的子系統(tǒng)由類和子系統(tǒng)組成,這些類或子系統(tǒng)對(duì)外提供功能。外部的類需要和子系統(tǒng)中不同的類交互,來
24、實(shí)現(xiàn)預(yù)期的功能。如果子系統(tǒng)中的類名改了,類的接口改了,那么會(huì)直接影響到外部類。語(yǔ)境/問題:一組分散的實(shí)現(xiàn)類或接口例如子系統(tǒng)內(nèi)部的接口和實(shí)現(xiàn)類要求一個(gè)公共的、一致的接口。如何處理與子系統(tǒng)元素直接耦合或子系統(tǒng)的實(shí)現(xiàn)可能變化的情況?解決方案:為子系統(tǒng)定義一個(gè)單一的連接點(diǎn)使用外觀對(duì)象封裝子系統(tǒng),外觀對(duì)象呈現(xiàn)一個(gè)單一的一致接口,負(fù)責(zé)客戶端程序與子系統(tǒng)組件的交互。4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)6外觀模式 46 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)6外觀模式外觀對(duì)象對(duì)子系統(tǒng)實(shí)現(xiàn)提供了受保護(hù)變化。外部對(duì)象只被耦合到外觀對(duì)象,子系統(tǒng)內(nèi)的實(shí)現(xiàn)和其他組件是私有的,不能被子系統(tǒng)外部組件訪問。 47 4 用GoF設(shè)計(jì)模式
25、設(shè)計(jì)用例實(shí)現(xiàn)6外觀模式public class Sale public void makeLineItem( ProductDescription desc, int quantity ) SalesLineItem sli = new SalesLineItem( desc, quantity ); / call to the Faade if ( POSRuleEngineFacade.getInstance().isInvalid( sli, this ) ) return; lineItems.add( sli ); / . / end of class 練習(xí):一個(gè)保安系統(tǒng)由兩個(gè)錄像機(jī)
26、、三個(gè)電燈、一個(gè)遙感器和一個(gè)警報(bào)器組成。保安系統(tǒng)的操作人員需要經(jīng)常將這些儀器啟動(dòng)和關(guān)閉。請(qǐng)使用外觀模式進(jìn)行設(shè)計(jì),實(shí)現(xiàn)儀器的啟動(dòng)和關(guān)閉 48 49 模式7觀察者模式 50 觀察者模式案例之一氣象站數(shù)據(jù)發(fā)布 51 問題:氣象站的濕度、溫度、氣壓數(shù)據(jù)要發(fā)布顯示到不同類型的顯示裝置上第一版本設(shè)計(jì) 52 53 該設(shè)計(jì)中存在的問題回憶設(shè)計(jì)原那么:將穩(wěn)定的和易變的局部分開,并且將易變的局部進(jìn)行封裝。應(yīng)用觀察者模式來處理易變的顯示裝置。概念:主題對(duì)象、觀察者 54 概念:觀察者注冊(cè) 55 Step1.鴨子申請(qǐng)注冊(cè)為觀察者Step2.恭喜!鴨子成為觀察者啦Step3.主題對(duì)象有數(shù)據(jù)更新,通知所有觀察者鴨子對(duì)象許
27、多觀察者88888概念:觀察者取消注冊(cè) 56 Step1.不想當(dāng)觀察者啦,老鼠申請(qǐng)被除名Step2.愿望實(shí)現(xiàn),老鼠被 除名老鼠對(duì)象老鼠對(duì)象許多觀察者Step3.清靜啦!主題對(duì)象有新數(shù)據(jù)更新時(shí),老鼠也不會(huì)接到通知啦14141414觀察者模式觀察者模式定義了主題對(duì)象和觀察者對(duì)象之間的一對(duì)多依賴,當(dāng)主題對(duì)象的狀態(tài)改變時(shí),依賴于它的所有觀察者都會(huì)收到通知并自動(dòng)更新。 57 58 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)7觀察者模式觀察者模式語(yǔ)境/問題:不同類型的訂閱者對(duì)象如窗口對(duì)發(fā)布者對(duì)象如sale的狀態(tài)改變或事件感興趣。當(dāng)發(fā)布者產(chǎn)生一個(gè)事件時(shí),訂閱者可以按自己的方式做出響應(yīng)。更進(jìn)一步,發(fā)布者希望維護(hù)和訂閱者
28、之間的松散耦合關(guān)系。如何實(shí)現(xiàn)?解決方案:定義“訂閱者或“監(jiān)聽者接口,各種類型的訂閱者實(shí)現(xiàn)此接口。發(fā)布者可以動(dòng)態(tài)注冊(cè)對(duì)其事件感興趣的訂閱者,當(dāng)事件發(fā)生時(shí)通知已注冊(cè)的訂閱者。觀察者模式:類圖 59 通過引入Suject和Observer接口,將具體的發(fā)布者和觀察者解耦,使得增加新的觀察者不會(huì)影響到發(fā)布者,也使得觀察者可以連接到新的發(fā)布者。思考:增加Subject接口有什么用意?設(shè)計(jì)原那么:交互的對(duì)象之間盡量解耦。觀察者模式案例之二氣象站數(shù)據(jù)發(fā)布?xì)庀笳景咐龑?shí)現(xiàn) 60 上述設(shè)計(jì)是主題對(duì)象將數(shù)據(jù)Push給觀察者,push哪些數(shù)據(jù)是主題對(duì)象指定的,這樣就不具備靈活性,譬如各個(gè)觀察者需要的數(shù)據(jù)可能是不一樣的
29、,又譬如主題對(duì)象如果新增數(shù)據(jù)就要修改主題對(duì)象的notifyObservers()方法。能否改為pull方式,即主題對(duì)象提供一系列g(shù)et方法來對(duì)外提供數(shù)據(jù),觀察者擁有主題對(duì)象的引用,能調(diào)用這些get方法來獲取數(shù)據(jù),獲取哪些數(shù)據(jù)由觀察者自己決定。Java的Built-in Observer模式能同時(shí)提供Push和Pull兩種方式。 61 62 如何把對(duì)象變成觀察者:實(shí)現(xiàn)觀察者接口,然后調(diào)用任何Observable對(duì)象的addObserver()方法可觀察者要如何送出通知:1先調(diào)用setChanged()方法,標(biāo)記狀態(tài)已經(jīng)改變的事實(shí);2然后調(diào)用兩種notifyObservers()方法中的一個(gè)not
30、ifyObservers() 或 notifyObservers(Object arg)觀察者如何接收通知:update(Observable o, Object arg),其中arg就是傳給觀察者的數(shù)據(jù)對(duì)象,采用pull模式時(shí)可觀察者傳null給arg。這就是我們以前所稱的“主題 Subject,現(xiàn)在改稱為“可觀察者Observable。我們不需要在此提供 register()、remove()和notifyObservers()方法,因?yàn)槲覀円呀?jīng)從超類繼承了這些行為。為了精簡(jiǎn)起見,此處沒有繪制DisplayElement接口,但是所有的布告板仍然必須實(shí)現(xiàn)此接口 63 4 觀察者模式應(yīng)用案例之二需求當(dāng)銷售總額變化時(shí),刷新GUI窗口顯示的銷售總額。能否在Sale改變了銷售總額時(shí),由Sale對(duì)象向窗口發(fā)送一條消息通知窗口刷新顯示?模型視圖別離原那么:模型對(duì)象非GUI對(duì)象,如sale應(yīng)不知道視圖和表示對(duì)象如窗口。它保證了表示層對(duì)象UI與其他層對(duì)象交互的低耦合度,從而允許用一個(gè)新的視圖或表示層來替代已有的視圖或表示層。 64 4 用GoF設(shè)計(jì)模式設(shè)計(jì)用例實(shí)現(xiàn)7觀察者模式
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小額信用借款合同書樣本
- 醫(yī)療器材合作合同樣本
- 農(nóng)村宅基地買賣合同樣本
- 夫妻雙方自愿離婚協(xié)議書撰寫要點(diǎn)
- 2024大學(xué)生就業(yè)協(xié)議書范例
- 離婚標(biāo)準(zhǔn)協(xié)議書815672024年
- 股東之間的投資合作協(xié)議
- 汽車買賣合同書樣本
- 電視劇動(dòng)畫制作合作協(xié)議
- 合同擔(dān)保書樣本
- 大學(xué)美育(同濟(jì)大學(xué)版)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024年2024年離婚協(xié)議書模板
- 福建省殘疾人崗位精英職業(yè)技能競(jìng)賽(美甲師)參考試題及答案
- 廣西邕衡教育名校聯(lián)盟2024-2025學(xué)年高三上學(xué)期10月適應(yīng)性檢測(cè)試題 英語(yǔ) 含答案
- 江蘇鹽城射陽(yáng)縣招考聘用部分村(居)宣傳文化管理員42人高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 中頻爐維修合同模板
- 液化石油氣泄漏應(yīng)急處理考核試卷
- 過敏性休克完整版本
- 早產(chǎn)兒低體重兒護(hù)理課件
- 6《人大代表為人民》(第2課時(shí))教學(xué)設(shè)計(jì)-2024-2025學(xué)年道德與法治六年級(jí)上冊(cè)統(tǒng)編版
- 大宗貿(mào)易居間合同協(xié)議書
評(píng)論
0/150
提交評(píng)論