軟件工程課件老師16設(shè)計(jì)模式_第1頁
軟件工程課件老師16設(shè)計(jì)模式_第2頁
軟件工程課件老師16設(shè)計(jì)模式_第3頁
軟件工程課件老師16設(shè)計(jì)模式_第4頁
軟件工程課件老師16設(shè)計(jì)模式_第5頁
已閱讀5頁,還剩119頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

11設(shè)計(jì)模式軟件設(shè)計(jì)是一門藝術(shù),是對“變化”的辯證處理:發(fā)現(xiàn)變化,隔離變化,以不變應(yīng)萬變。22什么是設(shè)計(jì)模式提供相關(guān)問題的解決方案每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的解決方案的核心。33描述設(shè)計(jì)模式模式名和分類簡潔的描述了模式的本質(zhì)意圖設(shè)計(jì)模式是做什么的它的基本原理和意圖是什么它解決的是什么樣的特定設(shè)計(jì)問題別名模式的其他名稱44描述設(shè)計(jì)模式動(dòng)機(jī)用以說明一個(gè)設(shè)計(jì)問題以及如何用模式中的類、對象來解決該問題的特定情景。適用性什么情況下使用該模式該模式可用來改進(jìn)哪些不良設(shè)計(jì)你怎樣識別這些情況結(jié)構(gòu)模式中類的圖形描述55描述設(shè)計(jì)模式參與者指設(shè)計(jì)模式中的類和/或?qū)ο笠约八鼈兏髯缘穆氊?zé)協(xié)作模式的參與者怎樣協(xié)作以實(shí)現(xiàn)它們的職責(zé)效果模式怎樣支持它的目標(biāo)?使用模式的效果和所需做的權(quán)衡取舍?系統(tǒng)結(jié)構(gòu)的哪些方面可以獨(dú)立改變?66描述設(shè)計(jì)模式實(shí)現(xiàn)已知應(yīng)用相關(guān)模式與這個(gè)模式緊密相關(guān)的模式有哪些?其間重要的不同之處是什么?這個(gè)模式應(yīng)與哪些其他模式一起使用?7723種設(shè)計(jì)模式簡介Abstractfactory(抽象工廠)提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需制定它們具體的類。Adapter(適配器)將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另一個(gè)接口。它使得原本由于接口不兼容而不能在一起工作的那些類可以在一起工作。Bridge(橋接)將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。8823種設(shè)計(jì)模式簡介Builder(生成器)將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。ChainofResponsibility(職責(zé)鏈)為解除請求的發(fā)送者和接受者之間的耦合,而使多個(gè)對象都有機(jī)會(huì)處理這個(gè)請求。將這些對象連成一條鏈,并沿著這個(gè)鏈傳遞該請求,直到有一個(gè)對象處理它。Command(命令)將一個(gè)請求封裝成一個(gè)對象,從而使你可用不同的請求對客戶進(jìn)行參數(shù)化;對請求排隊(duì)或記錄請求日志,以及支持可取消的操作。9923種設(shè)計(jì)模式簡介Composite(組成)將對象組合成樹型結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。它使得客戶對單個(gè)對象和復(fù)合對象的使用具有一致性。Decorator(裝飾)動(dòng)態(tài)的給一個(gè)對象添加一些額外的職責(zé)。就擴(kuò)展功能而言,該模式比生成子類的方式更為靈活。Facade(外觀)為子系統(tǒng)中的一組接口提供一個(gè)已知的界面,該模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。101023種設(shè)計(jì)模式簡介FactoryMethod(工廠方法)定義一個(gè)用于創(chuàng)建對象的接口,讓子類決定將哪一個(gè)類實(shí)例化。它使得一個(gè)類的實(shí)例化延遲到其子類。Flyweight(享元)運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對象。Interpreter(解釋器)給定一個(gè)語言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來解釋語言中的句子。111123種設(shè)計(jì)模式簡介Iterator(迭代器)提供一種方法順序訪問一個(gè)聚合對象中的各個(gè)元素,而又不需暴露該對象的內(nèi)部表示。Mediator(中介者)用一個(gè)中介對象來封裝一些列的對象交互。中介者使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。Memento(備忘錄)在不破壞封裝性的前提下,捕獲一個(gè)對象的內(nèi)部狀態(tài),并在該對象之外保存這個(gè)狀態(tài)。這樣以后就可將該對象恢復(fù)到保存的狀態(tài)。121223種設(shè)計(jì)模式簡介Observer(觀察者)定義對象間的一種一對多的依賴關(guān)系,以便當(dāng)一個(gè)對象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對象都得到通知并自動(dòng)刷新。Prototype(原型)用原型實(shí)例制定創(chuàng)建對象的種類,并通過拷貝這個(gè)原型來創(chuàng)建新的對象。Proxy(代理)為其他對象提供一個(gè)代理以控制對這個(gè)對象的訪問。131323種設(shè)計(jì)模式簡介Singleton(單件)保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。State(狀態(tài))允許一個(gè)對象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對象看起來似乎修改了他所屬的類。Strategy(策略)定義一系列算法,把它們一個(gè)個(gè)封裝起來,并且使它們可相互替換。本模式使得算法的變化可獨(dú)立于使用它的客戶。141423種設(shè)計(jì)模式簡介TemplateMethod(模版方法)定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。該模式使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。Visitor(訪問者)表示一個(gè)作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。1515模式分類目的創(chuàng)建型結(jié)構(gòu)型行為型范圍類FactoryMethodAdapter(類)InterpreterTemplateMethod對象AbstractFactoryBuilderPrototypeSingletonAdapter(對象)BridgeCompositeDecoratorFa?adeFlyweightProxyChainofResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor1616設(shè)計(jì)模式優(yōu)點(diǎn)面向接口編程創(chuàng)建型模式確保系統(tǒng)是采用針對接口的方式書寫的,而不是針對實(shí)現(xiàn)而書寫的。降低耦合性增加靈活性1717設(shè)計(jì)模式創(chuàng)建型模式將系統(tǒng)使用哪些具體的類的信息封裝起來隱藏了這些類的實(shí)例是如何被創(chuàng)建和放在一起的1818設(shè)計(jì)模式之Factory-工廠模式客戶類和工廠類分開。客戶任何時(shí)候需要某種產(chǎn)品,只需向工廠請求即可??蛻魺o須修改就可以接納新產(chǎn)品。缺點(diǎn)是當(dāng)產(chǎn)品修改時(shí),工廠類也要做相應(yīng)的修改。1919202021212222設(shè)計(jì)模式之Factory-工廠模式2323FACTORYMETHOD-工廠方法2424FACTORYMETHOD-工廠方法意圖定義一個(gè)用于創(chuàng)建對象的接口,讓子類決定實(shí)例化哪一個(gè)類。FactoryMethod使一個(gè)類的實(shí)例化延遲到其子類。

適用性:當(dāng)一個(gè)類不知道它所必須創(chuàng)建的對象的類的時(shí)候;當(dāng)一個(gè)類希望由它的子類來指定它所創(chuàng)建的對象的時(shí)候當(dāng)類將創(chuàng)建對象的職責(zé)委托給多個(gè)幫助子類的某一個(gè),并且你希望將哪一個(gè)幫助子類是代理者這一信息局部化的時(shí)候2525FACTORYMETHOD-工廠方法結(jié)構(gòu)參與者Product——定義工廠方法所創(chuàng)建的對象的接口ConcreteProduct——實(shí)現(xiàn)Product接口Creator——聲明工廠方法,該方法返回一個(gè)Product類型的對象??梢哉{(diào)用工廠方法以創(chuàng)建一個(gè)Product對象。ConcreteCreator——重定義工廠方法以返回一個(gè)ConcreteProduct實(shí)例2626FACTORYMETHOD-工廠方法協(xié)作Creator依賴于它的子類來定義工廠方法,所以它返回一個(gè)適當(dāng)?shù)腃oncreteProduct實(shí)例2727publicabstractclassCarFactory{

publicabstractCarcreator();}publicclassVM1FactoryextendsFactory{ publicCarcreator(){

.........

returnnewCar

}}publicclassVM2FactoryextendsFactory{ publicCarcreator(){

......

returnnewCar

}}2828AbstractFactory–抽象工廠意圖提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。2929AbstractFactory–抽象工廠參與者AbstractFactory——聲明一個(gè)創(chuàng)建抽象產(chǎn)品對象的操作接口ConcreteFactory——實(shí)現(xiàn)創(chuàng)建具體產(chǎn)品對象的操作AbstractProduct——為一類產(chǎn)品對象聲明一個(gè)接口ConcreteProduct定義一個(gè)將被相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品對象實(shí)現(xiàn)AbstractProduct接口Client僅使用由AbstractFactory和AbstractProduct類聲明的接口協(xié)作通常在運(yùn)行時(shí)刻創(chuàng)建一個(gè)ConcreteFactory類的實(shí)例。這一具體的工廠創(chuàng)建具有特定實(shí)現(xiàn)的產(chǎn)品對象。為創(chuàng)建不同的產(chǎn)品對象,客戶應(yīng)適用不同的具體工廠。AbstractFactory將產(chǎn)品對象的創(chuàng)建延遲到它的ConcreteFactory子類。3030publicabstractclassCarFactory{

publicabstractCarcreator();

publicabstractTruckcreator(Strings);}publicclassVM1FactoryextendsFactory{

publicCarcreator(){

.........

returnnewJetta

}

publicTruckcreator(Strings){

.........

returnnewBigBig

}}publicclassVM2extendsFactory{

publicCarcreator(){

......

returnnewPolo

}

publicTruckcreator(Strings){

......

returnnewLLL

}}3131AbstractFactory–抽象工廠與FactoryMethod模式的比較FactoryMethod模式利用給Factory對象傳遞不同的參數(shù),以返回具有相同基類或?qū)崿F(xiàn)了同一接口的對象AbstractFactory模式先利用Factory模式返回Factory對象,再通過Factory對象返回不同的對象3232Builder-建造模式將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

建造模式可以強(qiáng)制實(shí)行一種分步驟進(jìn)行的建造過程。3333Builder-建造模式參與者:Builder——為創(chuàng)建一個(gè)Product對象的各個(gè)部件制定抽象接口。ConcreteBuilder實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件定義并明確它所創(chuàng)建的表示提供一個(gè)檢索產(chǎn)品的接口Derector——構(gòu)造一個(gè)使用Builder接口的對象Product表示被構(gòu)造的復(fù)雜對象包含定義組成部件的類3434Builder-建造模式協(xié)作:客戶創(chuàng)建Director對象,并用它所想要的Builder對象進(jìn)行配置一旦產(chǎn)品部件被生成,導(dǎo)向器就會(huì)通知生成器生成器處理導(dǎo)向器的請求,并將部件添加到該產(chǎn)品中客戶從生成器中檢索產(chǎn)品3535publicinterfaceBuilder{

//創(chuàng)建部件A:比如汽車車輪

voidbuildPartA();

//創(chuàng)建部件B:比如方向盤

voidbuildPartB();

//創(chuàng)建部件C:比如發(fā)動(dòng)機(jī)

voidbuildPartC();

//返回最終組裝產(chǎn)品成果(返回最后裝配好的汽車)

//成品的組裝過程不在這里進(jìn)行,而是轉(zhuǎn)移到下面的Director中進(jìn)行。

//從而實(shí)現(xiàn)過程與部件的解耦。

ProductgetResult();}publicclassDirector{

privateBuilderbuilder; publicDirector(Builderbuilder){

this.builder=builder;

}

//將partA,partB,partC最后組成復(fù)雜物件

//汽車的組裝過程

publicvoidconstruct(){

builder.buildPartA();

builder.buildPartB();

builder.buildPartC();

}}3636PROTOTYPE-原型模式意圖用原型實(shí)例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。其實(shí)是將product和factory功能合二為一了。缺點(diǎn)是每一個(gè)類都必須配備一個(gè)克隆方法。適用性:當(dāng)一個(gè)系統(tǒng)應(yīng)該獨(dú)立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時(shí),要使用Prototype模式;以及當(dāng)要實(shí)例化的類是在運(yùn)行時(shí)刻指定時(shí);或者為了避免創(chuàng)建一個(gè)與產(chǎn)品類層次平行的工廠類層次時(shí);或者當(dāng)一個(gè)類的實(shí)例只能由幾個(gè)不同狀態(tài)組合中的一種時(shí)。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些。3737PROTOTYPE-原型模式參與者Prototype——聲明一個(gè)克隆自身的接口。ConcretePrototype——實(shí)現(xiàn)一個(gè)克隆自身的操作。Client——讓一個(gè)原型克隆自身從而創(chuàng)建一個(gè)新的對象。協(xié)作客戶請求一個(gè)原型克隆自身3838publicabstractclassAbstractSpoonimplementsCloneable

{

StringspoonName;

publicvoidsetSpoonName(StringspoonName){this.spoonName=spoonName;}

publicStringgetSpoonName(){returnthis.spoonName;}

publicObjectclone()

{

Objectobject=null;

try{

object=super.clone();

}catch(CloneNotSupportedExceptionexception){

System.err.println("AbstractSpoonisnotCloneable");

}

returnobject;

}

}

publicclassSoupSpoonextendsAbstractSpoon

{

publicSoupSpoon()

{

setSpoonName("SoupSpoon");

}

}publicclassSaladSpoonextendsAbstractSpoon

{

publicSaladSpoon()

{

setSpoonName("SaladSpoon");

}

}3939設(shè)計(jì)模式之Singleton-單例模式意圖保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。

類自身負(fù)責(zé)保存它的唯一實(shí)例。解決的主要是性能問題,而非耦合(變化)的問題。適用性當(dāng)類只能由一個(gè)實(shí)例而且客戶可以從一個(gè)眾所周知的訪問點(diǎn)訪問它時(shí)當(dāng)這個(gè)唯一實(shí)例應(yīng)該是通過子類化可擴(kuò)展的,并且客戶應(yīng)該無需更改代碼就能使用一個(gè)擴(kuò)展的實(shí)例時(shí)。4040設(shè)計(jì)模式之Singleton-單例模式參與者Singleton定義一個(gè)Instance操作,允許客戶訪問它的唯一實(shí)例。可能負(fù)責(zé)創(chuàng)建它自己的唯一實(shí)例。協(xié)作客戶只能通過Singleton的Instance操作訪問一個(gè)Singleton實(shí)例。4141publicclassSingleton{

privatestaticSingletoninstance=null;

publicstaticsynchronizedSingletongetInstance(){

//這個(gè)方法比上面有所改進(jìn),不用每次都進(jìn)行生成對象,

//只是第一次使用時(shí)生成實(shí)例,提高了效率!

if(instance==null)

instance=newSingleton();

returninstance;

}}

4242創(chuàng)建型模式小結(jié)創(chuàng)建型模式規(guī)定了創(chuàng)建對象的方式。在必須決定實(shí)例化某個(gè)類時(shí),使用這些模式。通常,由抽象超類封裝實(shí)例化類的細(xì)節(jié),這些細(xì)節(jié)包括這些類確切是什么,以及如何及何時(shí)創(chuàng)建這些類。對客戶類來講,這些類的細(xì)節(jié)是隱藏的??蛻纛愔恢莱橄箢惢虺橄箢悓?shí)現(xiàn)的接口。客戶類通常并不知道具體類的確切類型。當(dāng)系統(tǒng)演化依賴于對象的組合、聚集時(shí),創(chuàng)建型模式帶來了更大的靈活性。4343設(shè)計(jì)模式結(jié)構(gòu)型模式如何組合類和對象以獲得更大的結(jié)構(gòu)類模型采用繼承機(jī)制來組合接口或?qū)崿F(xiàn),如采用多重繼承方法將兩個(gè)以上的類組合成一個(gè)類對象模式不是對接口和實(shí)現(xiàn)進(jìn)行組合,它描述了如何對一些對象進(jìn)行組合,從而實(shí)現(xiàn)新功能的一些方法。在運(yùn)行時(shí)刻改變對象組合關(guān)系,具有更大的靈活性。4444Adapter-適配器把一個(gè)類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一起工作的兩個(gè)類能夠一起工作。適配類可以根據(jù)參數(shù)返還一個(gè)合適的實(shí)例給客戶端。4545使用多重繼承對一個(gè)接口與另一個(gè)接口進(jìn)行匹配4646對象匹配器依賴于對象組合4747Adapter-適配器參與者Target——定義Client使用的與特定另一相關(guān)的接口Client——與符合Target接口的對象協(xié)同Adaptee——定義一個(gè)已經(jīng)存在的接口,這個(gè)接口需要適配Adapter——對Adaptee的接口與Target接口進(jìn)行適配協(xié)作Client在Adapter實(shí)例上調(diào)用一些操作。接著適配器調(diào)用Adaptee的操作實(shí)現(xiàn)這個(gè)請求。4848publicinterfaceIRoundPeg{

publicvoidinsertIntoHole(Stringmsg);}publicinterfaceISquarePeg{

publicvoidinsert(Stringstr);}publicclassPegAdapterimplementsIRoundPeg,ISquarePeg{

privateRoundPegroundPeg;

privateSquarePegsquarePeg;

//構(gòu)造方法

publicPegAdapter(RoundPegpeg){this.roundPeg=peg;}//構(gòu)造方法

publicPegAdapter(SquarePegpeg){this.squarePeg=peg;}

publicvoidinsert(Stringstr){roundPeg.insertIntoHole(str);}

publicvoidinsertIntoHole(Stringstr){SquarePeg.insert(str);}}49495050Bridge-橋梁模式將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。解決2個(gè)方面的變化問題:抽象與實(shí)現(xiàn)。即一個(gè)類中多個(gè)方向的變化問題。5151Bridge-橋梁模式參與者Abstraction定義抽象類的接口維護(hù)一個(gè)指向Implementor類型對象的指針RefinedAbstraction——擴(kuò)充由Abstraction定義的接口Implementor——定義實(shí)現(xiàn)類的接口,該接口不一定要與 Abstraction的接口完全一致。ConcreteImplementor——實(shí)現(xiàn)Implementor接口并定義它的具體 實(shí)現(xiàn)協(xié)作Abstraction將Client的請求轉(zhuǎn)發(fā)給它的Implementor對象5252publicabstractclassCoffee

{

CoffeeImpcoffeeImp;

publicvoidsetCoffeeImp(){

this.CoffeeImp=CoffeeImpSingleton.getTheCoffeImp();

}

publicSodaImpgetCoffeeImp(){returnthis.CoffeeImp;}

publicabstractvoidpourCoffee();

}publicabstractclassCoffeeImp

{

publicabstractvoidpourCoffeeImp();

}//bridgepublicclassCoffeeImpSingleton

{privatestaticCoffeeImpcoffeeImp;

publicCoffeeImpSingleton(CoffeeImpcoffeeImpIn)

{this.coffeeImp=coffeeImpIn;}

publicstaticCoffeeImpgetTheCoffeeImp()

{

returncoffeeImp;

}

}

53535454Bridge-橋梁模式5555Composite-合成模式合成模式把部分與整體關(guān)系用樹結(jié)構(gòu)表示。合成模式使得用戶對單個(gè)對象和組合對象的使用具有一致性。56565757Composite-合成模式參與者Component為組合中的對象聲明接口在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的缺省行為聲明一個(gè)接口用于訪問和管理Component的子組件(可選)在遞歸結(jié)構(gòu)中定義一個(gè)接口,用于訪問一個(gè)父部件,并在合適的情況下實(shí)現(xiàn)它Leaf在組合中表示葉節(jié)點(diǎn)對象,葉節(jié)點(diǎn)沒有子節(jié)點(diǎn)在組合中定義圖元對象的行為Composite定義有子部件的那些部件的行為存儲子部件在Component接口中實(shí)現(xiàn)與子部件有關(guān)的操作Client通過Component接口操縱組合部件的對象5858Composite-合成模式協(xié)作用戶使用Component類接口與組合結(jié)構(gòu)中的對象進(jìn)行交互。如果接收者是一個(gè)葉節(jié)點(diǎn),則直接處理請求。如果接收者是Composite,它通常將請求發(fā)送給它的子部件,在轉(zhuǎn)發(fā)請求之前與/或之后,可能執(zhí)行一些輔助操作。5959publicabstractclassEquipment{

privateStringname;

//網(wǎng)絡(luò)價(jià)格

publicabstractdoublenetPrice();

//打折價(jià)格

publicabstractdoublediscountPrice();

//增加部件

publicbooleanadd(Equipmentequipment){returnfalse;}

//刪除部件

publicbooleanremove(Equipmentequipment){returnfalse;}

//注意這里,提供一種用于訪問組合部件的方法。

publicIteratoriter(){returnnull;}

publicEquipment(finalStringname){=name;}}

publicclassDiskextendsEquipmentabstractclassCompositeEquipmentextendsEquipment6060DECORATOR-裝飾模式意圖動(dòng)態(tài)地給一個(gè)對象添加一些額外的職責(zé)。就增加功能來說,Decorator模式相比生成子類更為靈活。一個(gè)類可能有些額外的責(zé)任(除了主體業(yè)務(wù)操作),如加密、緩存、壓縮等,這些可能只是輔助主體業(yè)務(wù)的附著,并不嚴(yán)格按照維度變化。裝飾模式以對客戶端透明的方式擴(kuò)展對象的功能,是繼承關(guān)系的一個(gè)替代方案,提供比繼承更多的靈活性。動(dòng)態(tài)給一個(gè)對象增加功能,這些功能可以再動(dòng)態(tài)的撤消。增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能。既繼承又組合,實(shí)際上是將Bridge中的抽象和實(shí)現(xiàn)合二為一了,是其特殊形式。

6161參與者Component——定義一個(gè)對象接口,可以給這些對象動(dòng)態(tài)地添加職責(zé)。ponent——定義一個(gè)對象,可以給這個(gè)對象添加一些職責(zé)。Decorator——維持一個(gè)指向Component對象的指針,并定義一個(gè)與 Component接口一致的接口ConcreteDecorator——向組件添加職責(zé)。協(xié)作Decorator將請求轉(zhuǎn)發(fā)給它的Component對象,并有可能在轉(zhuǎn)發(fā)請求前后執(zhí)行一些附加的動(dòng)作6262publicinterfaceWork{

publicvoidinsert();}publicclassSquarePegimplementsWork{

publicvoidinsert(){

System.out.println(“方形杵插入");

}}publicclassDecoratorimplementsWork{

privateWorkwork;

//額外增加的功能打包在List中

privateArrayListothers=newArrayList();

//在構(gòu)造器中使用組合new方式,引入Work;

publicDecorator(Workwork){

this.work=work;

others.add(“挖坑");

others.add(“釘木板");

}

publicvoidinsert(){

newMethod();

}

//新方法中在insert之前增加其他方法,這里次序先后是用戶靈活指定的

publicvoidnewMethod(){

otherMethod();

work.insert();

}

publicvoidotherMethod(){

ListIteratorlistIterator=others.listIterator();

while(listIterator.hasNext())

{

System.out.println(((String)(listIterator.next()))+“正在進(jìn)行");

}

}}6363Facade-門面模式外部與一個(gè)子系統(tǒng)的通信必須通過一個(gè)統(tǒng)一的門面對象進(jìn)行。門面模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用。每一個(gè)子系統(tǒng)只有一個(gè)門面類,而且此門面類只有一個(gè)實(shí)例,也就是說它是一個(gè)單例模式。但整個(gè)系統(tǒng)可以有多個(gè)門面類。6464Facade-門面模式參與者Facade知道哪些子系統(tǒng)類負(fù)責(zé)處理請求將客戶的請求代理給適當(dāng)?shù)淖酉到y(tǒng)對象Subsystem實(shí)現(xiàn)子系統(tǒng)的功能處理由Facade對象指派的任務(wù)沒有Facade的任何相關(guān)信息;即沒有指向Facade的指針協(xié)作客戶程序通過發(fā)送給Facade的方式與子系統(tǒng)通訊,F(xiàn)acade將這些消息轉(zhuǎn)發(fā)給適當(dāng)?shù)淖酉到y(tǒng)對象。盡管是子系統(tǒng)中有關(guān)對象在做實(shí)際工作,但Facade模式本身也必須將它的接口轉(zhuǎn)換成子系統(tǒng)的接口。使用Facade的客戶程序不需要直接訪問子系統(tǒng)對象。6565publicclasspare{ Stringsql=“SELECT*FROM<table> WHERE<columnname>=?”;

try{

Mysqlmsql=newmysql(sql);

prep.setString(1,“<columnvalue>”);

rset=prep.executeQuery();

if(rset.next()){

System.out.println(rset.getString(“<columnname>”));

}

}catch(SExceptione){

e.printStackTrace();

}finally{

mysql.close();

mysql=null;

}

}6666FLYWEIGHT

-享元模式享元模式以共享的方式高效的支持大量的細(xì)粒度對象。采用類似于Hash表的方式,共享的思想??蛻舳瞬豢梢灾苯觿?chuàng)建被共享的對象,而應(yīng)當(dāng)使用一個(gè)工廠對象負(fù)責(zé)創(chuàng)建被共享的對象。享元模式大幅度的降低內(nèi)存中對象的數(shù)量,主要解決OO性能問題。67676868FLYWEIGHT

-享元模式參與者Flyweight描述一個(gè)接口,通過這個(gè)接口Flyweight可以接受并作用于外部狀態(tài)。ConcreteFlyweight實(shí)現(xiàn)Flyweight接口,并為內(nèi)部狀態(tài)(如果有的話)增加存儲空間。UnsharedConcreteFlyweight并非所有的Flyweight子類都需要被共享。Flyweight接口使共享成為可能,但它并不強(qiáng)制共享。在Flyweight對象結(jié)構(gòu)的某些層次,UnsharedConcreteFlyweight對象通常將ConcreteFlyweight對象作為子節(jié)點(diǎn)。FlyweightFactory創(chuàng)建并管理Flyweight對象確保合理地共享Flyweight。Client維持一個(gè)對Flyweight的引用計(jì)算或存儲一個(gè)(多個(gè))Flyweight的外部狀態(tài)6969FLYWEIGHT

-享元模式協(xié)作Flywelght執(zhí)行時(shí)所需的狀態(tài)必定是內(nèi)部的或外部的。內(nèi)部狀態(tài)存儲于ConcreteFlyweight對象之中;而外部對象則由Client對象存儲或計(jì)算。當(dāng)用戶調(diào)用Flywelght對象的操作時(shí),將該狀態(tài)傳遞給它。用戶不應(yīng)直接對ConcreteFlyweight類進(jìn)行實(shí)例話,而只能從FlywelghtFactory對象得到ConcreteFlyweight對象,這可以保證對它們適當(dāng)?shù)剡M(jìn)行共享。7070publicclassCD{

privateStringtitle;

privateintyear;

privateArtistartist;

publicStringgetTitle(){returntitle;}

publicintgetYear(){returnyear;}

publicArtistgetArtist(){returnartist;}

publicvoidsetTitle(Stringt){title=t;}

publicvoidsetYear(inty){year=y;}

publicvoidsetArtist(Artista){artist=a;}}publicclassArtist{

//內(nèi)部狀態(tài)

privateStringname;

//notethatArtistisimmutable.

StringgetName(){returnname;}

Artist(Stringn){name=n;}}publicclassArtistFactory{

Hashtablepool=newHashtable();

ArtistgetArtist(Stringkey){

Artistresult; result=(Artist)pool.get(key); //產(chǎn)生新的Artist

if(result==null){

result=newArtist(key);

pool.put(key,result);

}

returnresult; }}7171PROXY-代理模式代理模式給某一個(gè)對象提供一個(gè)代理對象,并由代理對象控制對源對象的引用。代理就是一個(gè)人或一個(gè)機(jī)構(gòu)代表另一個(gè)人或者一個(gè)機(jī)構(gòu)采取行動(dòng)。代理對象可以在客戶和目標(biāo)對象直接起到中介的作用??蛻舳朔直娌怀龃碇黝}對象與真實(shí)主題對象。代理模式可以并不知道真正的被代理對象,而僅僅持有一個(gè)被代理對象的接口,這時(shí)候代理對象不能夠創(chuàng)建被代理對象,被代理對象必須有系統(tǒng)的其他角色代為創(chuàng)建并傳入。72727373PROXY-代理模式參與者Proxy保存一個(gè)引用使得代理可以訪問實(shí)體。提供一個(gè)與Subject的接口相同的接口,這樣代理就可以用來代替實(shí)體??刂茖?shí)體的存取,并可能負(fù)責(zé)創(chuàng)建和刪除它。Subject定義RealSubject和Proxy的公共接口,這樣就在任何使用RealSubject的地方都可以使用Proxy。RealSubject定義Proxy對代表的實(shí)體。協(xié)作代理根據(jù)其種類,在適當(dāng)?shù)臅r(shí)候向RealSubject轉(zhuǎn)發(fā)請求。7474publicclassForumPermissionsimplementsCacheablepublicclassForumProxyimplementsForumpublicclassDbForumimplementsForum,Cacheable7575設(shè)計(jì)模式行為模式算法和對象間職責(zé)的分配。不僅描述了對象或類的模式,還描述它們之間的通信模式。刻畫了在運(yùn)行時(shí)難以跟蹤的復(fù)雜的控制流。7676ChainofResponsibility–職責(zé)鏈

很多對象由每一個(gè)對象對其下家的引用而接起來形成一條鏈。請求在這個(gè)鏈上傳遞,直到鏈上的某一個(gè)對象決定處理此請求。客戶并不知道鏈上的哪一個(gè)對象最終處理這個(gè)請求,系統(tǒng)可以在不影響客戶端的情況下動(dòng)態(tài)的重新組織鏈和分配責(zé)任。處理者有兩個(gè)選擇:承擔(dān)責(zé)任或者把責(zé)任推給下家。一個(gè)請求可以最終不被任何接收端對象所接受。77777878ChainofResponsibility–職責(zé)鏈

參與者Handler定義一個(gè)處理請求的接口實(shí)現(xiàn)后繼鏈ConcreteHandle處理它所負(fù)責(zé)的請求可訪問它的后繼者如果可處理該請求,就處理之;否則將該請求轉(zhuǎn)發(fā)給它的后繼者。Client向鏈上的具體處理者對象提交請求協(xié)作當(dāng)客戶提交一個(gè)請求時(shí),請求沿鏈傳遞直至有一個(gè)ConcreteHandle對象負(fù)責(zé)處理它。7979publicinterfaceHandler{

publicvoidhandleRequest(Requestrequest);}

publicclassRequest{

privateStringtype;

publicRequest(Stringtype){this.type=type;}

publicStringgetType(){returntype;}

publicvoidexecute(){

//request真正具體行為代碼

}}publicclassConcreteHandlerimplementsHandler{

privateHandlersuccessor;

publicConcreteHandler(Handlersuccessor){

this.successor=successor;

}

publicvoidhandleRequest(Requestrequest){

if(requestinstanceofHelpRequest){

//這里是處理Help的具體代碼

}elseif(requestinstanceofPrintRequst){

request.execute();

}else{

//傳送到下一個(gè)

successor.handle(request); } }}8080COMMAND-命令模式

命令模式把一個(gè)請求或者操作封裝到一個(gè)對象中。命令模式把發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開,委派給不同的對象。命令模式允許請求的一方和發(fā)送的一方獨(dú)立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎么被接收,以及操作是否執(zhí)行,何時(shí)被執(zhí)行以及是怎么被執(zhí)行的。系統(tǒng)支持命令的撤消。81818282COMMAND-命令模式

參與者Command聲明執(zhí)行操作的接口mand將一個(gè)接收者對象綁定與一個(gè)動(dòng)作調(diào)用接收者相應(yīng)的操作,以實(shí)現(xiàn)ExecuteClient創(chuàng)建一個(gè)具體命令對象并設(shè)定它的接收者Invoker要求該命令執(zhí)行這個(gè)請求Receiver知道如何實(shí)施與執(zhí)行一個(gè)請求相關(guān)的操作。任何類都可能作為一個(gè)接收者。8383COMMAND-命令模式

協(xié)作Client創(chuàng)建一個(gè)mand對象并指定它的Receiver對象。某Invoker對象存儲該mand對象該Invoker通過調(diào)用Command對象的Execute操作來提交一個(gè)請求。若該命令是可撤銷的,mand就在執(zhí)行Execute操作之前存儲當(dāng)前狀態(tài)以用于取消命令。mand對象對調(diào)用它的Receiver的一些操作以執(zhí)行該請求。8484publicinterfaceCommand{

publicabstractvoidexecute();}publicclassproducer{

publicstaticListproduceRequests(){

Listqueue=newArrayList();

queue.add(newDomesticEngineer());

queue.add(newPolitician());

queue.add(newProgrammer());

returnqueue;

}}publicclassmand{

publicstaticvoidmain(String[]args){

Listqueue=PduceRequests();

for(Iteratorit=queue.iterator();it.hasNext();) //取出List中的內(nèi)容,其他特征不能確定,只能保證一個(gè)特征是100%正確,

//他們至少是界面Command的“兒子”。所以強(qiáng)制轉(zhuǎn)換類型為Command

((Command)it.next()).execute();

}}8585INTERPRETER-解釋器模式給定一個(gè)語言后,解釋器模式可以定義出其文法的一種表示,并同時(shí)提供一個(gè)解釋器??蛻舳丝梢允褂眠@個(gè)解釋器來解釋這個(gè)語言中的句子。解釋器模式將描述怎樣在有了一個(gè)簡單的文法后,使用模式設(shè)計(jì)解釋這些語句。在解釋器模式里面提到的語言是指任何解釋器對象能夠解釋的任何組合。在解釋器模式中需要定義一個(gè)代表文法的命令類的等級結(jié)構(gòu),也就是一系列的組合規(guī)則。每一個(gè)命令對象都有一個(gè)解釋方法,代表對命令對象的解釋。命令對象的等級結(jié)構(gòu)中的對象的任何排列組合都是一個(gè)語言。86868787INTERPRETER-解釋器模式參與者AbstractExpression聲明一個(gè)抽象的解釋操作,這個(gè)接口為抽象語法樹種所有的節(jié)點(diǎn)所共享。TerminalExpression實(shí)現(xiàn)與文法中的終結(jié)符相關(guān)聯(lián)的解釋操作一個(gè)句子中的每個(gè)終結(jié)符需要該類的一個(gè)實(shí)例NonterminalExpression非終結(jié)符表達(dá)式Context包含解釋其之外的一些全局信息Client構(gòu)建表示該文法定義的語言中一個(gè)特定的句子的抽象語法樹調(diào)用解釋操作8888INTERPRETER-解釋器模式協(xié)作Client構(gòu)建(或被給定)一個(gè)句子,它是NonterminalExpression和TerminalExpression的實(shí)例的一個(gè)抽象語法樹。然后初始化上下文并調(diào)用解釋操作。每一非終結(jié)符表達(dá)式節(jié)點(diǎn)定義相應(yīng)子表達(dá)的解釋操作。而各終結(jié)符表達(dá)式的解釋操作構(gòu)成了遞歸的基礎(chǔ)。每一節(jié)點(diǎn)的解釋操作用上下文來存儲和訪問解釋器的狀態(tài)。8989ITERATOR-迭代子模式迭代子模式可以順序訪問一個(gè)聚集中的元素而不必暴露聚集的內(nèi)部表象。多個(gè)對象聚在一起形成的總體稱之為聚集,聚集對象是能夠包容一組對象的容器對象。迭代子模式將迭代邏輯封裝到一個(gè)獨(dú)立的子對象中,從而與聚集本身隔開。迭代子模式簡化了聚集的界面。每一個(gè)聚集對象都可以有一個(gè)或一個(gè)以上的迭代子對象,每一個(gè)迭代子的迭代狀態(tài)可以是彼此獨(dú)立的。迭代算法可以獨(dú)立于聚集角色變化。90909191ITERATOR-迭代子模式參與者Iterator——迭代器定義訪問和遍歷元素的接口。ConcreteIterator具體迭代器實(shí)現(xiàn)迭代器接口對該聚合遍歷時(shí)跟蹤當(dāng)前位置Aggregate——聚合定義創(chuàng)建相應(yīng)迭代器對象的接口ConcreteAggregate具體聚合實(shí)現(xiàn)創(chuàng)建相應(yīng)迭代器的接口,該操作返回ConcreteIterator的一個(gè)適當(dāng)?shù)膶?shí)例。協(xié)作ConcreteIterator跟蹤聚合中的當(dāng)前對象,并能夠計(jì)算出待遍歷的后繼對象9292遍歷Collection中內(nèi)容publicclassmand{

publicstaticvoidmain(String[]args){

Listqueue=PduceRequests();

for(Iteratorit=queue.iterator();it.hasNext();)

((Command)it.next()).execute();

}}9393MEDIATOR-調(diào)停者模式調(diào)停者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以松散偶合。當(dāng)某些對象之間的作用發(fā)生改變時(shí),不會(huì)立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨(dú)立的變化。調(diào)停者模式將多對多的相互作用轉(zhuǎn)化為一對多的相互作用。調(diào)停者模式將對象的行為和協(xié)作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。架構(gòu)級模式,F(xiàn)a?ade解決子系統(tǒng)間的問題,Mediator解決子系統(tǒng)內(nèi)(對象間)復(fù)雜問題。94949595MEDIATOR-調(diào)停者模式參與者M(jìn)ediator中介者定義一個(gè)接口用于與各同事對象通信。ConcreteMediator具體中介者通過協(xié)調(diào)各同事對象實(shí)現(xiàn)協(xié)作行為了解并維護(hù)它的各個(gè)同事Colleagueclass每一個(gè)同事類都知道它的中介者對象每一個(gè)同事對象在需與其他的同時(shí)通信的時(shí)候,與它的中介者通信協(xié)作同事向一個(gè)中介對象發(fā)送和接收請求。中介者在各同事間適當(dāng)?shù)剞D(zhuǎn)發(fā)請求以實(shí)現(xiàn)協(xié)作行為9696publicinterfaceMediator{}publicclassConcreteMediatorimplementsMediator{

//假設(shè)當(dāng)前有兩個(gè)成員

privateConcreteColleague1colleague1=newConcreteColleague1();

privateConcreteColleague2colleague2=newConcreteColleague2();

...}

publicclassColleague{

privateMediatormediator;

publicMediatorgetMediator(){

returnmediator; }

publicvoidsetMediator(Mediatormediator){

this.mediator=mediator; }}publicclassConcreteColleague1{}publicclassConcreteColleague2{}9797MEMENTO-備忘錄模式備忘錄對象是一個(gè)用來存儲另外一個(gè)對象內(nèi)部狀態(tài)的快照的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個(gè)對象的狀態(tài)捉住,并外部化,存儲起來,從而可以在將來合適的時(shí)候把這個(gè)對象還原到存儲起來的狀態(tài)。98989999MEMENTO-備忘錄模式參與者M(jìn)emento備忘錄存儲原發(fā)器對象的內(nèi)部狀態(tài)。原發(fā)器根據(jù)需要決定備忘錄存儲原發(fā)器的哪些內(nèi)部狀態(tài)。防止原發(fā)器以外的其他對象訪問備忘錄。Originator原發(fā)器創(chuàng)建一個(gè)備忘錄,用以記錄當(dāng)前時(shí)刻它的內(nèi)部狀態(tài)。使用備忘錄恢復(fù)內(nèi)部狀態(tài)Caretaker負(fù)責(zé)保存好備忘錄不能對備忘錄的內(nèi)容進(jìn)行操作或檢查協(xié)作管理器向原發(fā)器請求一個(gè)備忘錄,保留一段時(shí)間后,將其送回給原發(fā)器。100100publicclassOriginator{ privateintnumber; privateFilefile=null;

publicOriginator(){}

//創(chuàng)建一個(gè)Memento publicMementogetMemento(){

returnnewMemento(this); }

//恢復(fù)到原始值

publicvoidsetMemento(Mementom){

number=m.number;

file=m.file; }}privateclassMementoimplementsjava.io.Serializable{

privateintnumber;

privateFilefile=null;

publicMemento(Originatoro){

number=o.number;

file=o.file;

}}101101OBSERVER-觀察者模式觀察者模式定義了一種一對多的依賴關(guān)系,讓多個(gè)觀察者對象同時(shí)監(jiān)聽某一個(gè)主題對象。這個(gè)主題對象在狀態(tài)上發(fā)生變化時(shí),會(huì)通知所有觀察者對象,使他們能夠自動(dòng)更新自己。102102103103OBSERVER-觀察者模式參與者Subject(目標(biāo))目標(biāo)知道它的觀察者??梢杂腥我舛鄠€(gè)觀察者觀察同一個(gè)目標(biāo)。提供注冊和刪除觀察者對象的接口。Observer(觀察者)為那些在目標(biāo)發(fā)生改變時(shí)需獲得通知的對象定義一個(gè)更新接口。ConcreteSubject(具體目標(biāo))將有關(guān)狀態(tài)存入各ConcreteObserver對象當(dāng)它的狀態(tài)發(fā)生改變時(shí),向它的各個(gè)觀察者發(fā)出通知ConcreteObserver(具體觀察者)維護(hù)一個(gè)指向ConcreteSubject對象的引用存儲有關(guān)狀態(tài),這些狀態(tài)應(yīng)與目標(biāo)的狀態(tài)保持一致實(shí)現(xiàn)Observer的更新接口以使自身狀態(tài)與目標(biāo)的狀態(tài)保持一致104104OBSERVER-觀察者模式協(xié)作當(dāng)ConcreteSubject發(fā)生任何可能導(dǎo)致其觀察者與其本省狀態(tài)不一致的改變時(shí),它將通知它的各個(gè)觀察者在得到一個(gè)具體目標(biāo)的改變通知后,ConcreteObserver對象可向目標(biāo)對象查詢信息。ConcreteObserver使用這些信息以使它的狀態(tài)與目標(biāo)對象的狀態(tài)一致。105105publicclassproductextendsObservable{ privateStringname;

privatefloatprice;

publicStringgetName(){returnname;}

publicvoidsetName(){

=name;

//設(shè)置變化點(diǎn)

setChanged();

notifyObservers(name); }

}publicclassNameObserverimplementsObserver{

privateStringname=null;

publicvoidupdate(Observableobj,Objectarg){

if(arginstanceofString){

name=(String)arg;

//產(chǎn)品名稱改變值在name中

System.out.println("NameObserver:namechangetto"+name);

}

}}106106STATE-狀態(tài)模式狀態(tài)模式允許一個(gè)對象在其內(nèi)部狀態(tài)改變的時(shí)候改變行為。這個(gè)對象看上去象是改變了它的類一樣。狀態(tài)模式把所研究的對象的行為包裝在不同的狀態(tài)對象里,每一個(gè)狀態(tài)對象都屬于一個(gè)抽象狀態(tài)類的一個(gè)子類。狀態(tài)模式的意圖是讓一個(gè)對象在其內(nèi)部狀態(tài)改變的時(shí)候,其行為也隨之改變。狀態(tài)模式需要對每一個(gè)系統(tǒng)可能取得的狀態(tài)創(chuàng)立一個(gè)狀態(tài)類的子類。當(dāng)系統(tǒng)的狀態(tài)變化時(shí),系統(tǒng)便改變所選的子類。管理類在不同狀態(tài)下的行為。107107108108STATE-狀態(tài)模式參與者Context定義客戶感興趣的接口維護(hù)一個(gè)ConcreteState子類的實(shí)例State定義一個(gè)接口以封裝與Context的一個(gè)特定狀態(tài)相關(guān)的行為ConcreteStatesubclasses每一子類實(shí)現(xiàn)一個(gè)與Context的一個(gè)狀態(tài)相關(guān)的行為109109STATE-狀態(tài)模式協(xié)作Context將與狀態(tài)相關(guān)的請求委托給當(dāng)前的ConcreteState對象處理Context可將自身作為一個(gè)參數(shù)傳遞給處理該請求的狀態(tài)對象。這使得狀態(tài)對象在必要的時(shí)候可訪問Context。Context是客戶使用的主要接口Context或ConcreteState子類都可決定哪個(gè)狀態(tài)是另一個(gè)的后繼者,以及是在何種條件下進(jìn)行狀態(tài)裝換。110110publicclassBlueStateextendsState{ publicvoidhandlepush(Contextc){

//根據(jù)push方法“如果是blue狀態(tài)的切換到green”;

c.setState(newGreenState());

}

publicvoidhandlepull(Contextc){

//根據(jù)pull方法“如果是blue狀態(tài)的切換到red”;

c.setState(newRedState()); }

publicabstractvoidgetcolor(){return(Color.blue);}}publicclassContext{ privateSatestate=null;//將原來的Colorstate改成了新建的Statestate; //setState是用來改變state的狀態(tài),使用setState實(shí)現(xiàn)狀態(tài)切換

pulicvoidsetState(Statestate){

this.state=state; } publicvoidpush(){

//狀態(tài)切換細(xì)節(jié),本例是顏色變化,封裝在子類handlepush中,此處無需關(guān)心

state.handlepush(this);

//因?yàn)閟ample要使用state中的一個(gè)切換結(jié)果,使用getColor()

Samplesample=newSample(state.getColor());

sample.operate(); } publicvoidpull(){

state.handlepull(this);

Sample2sample2=newSample2(state.getColor());

sample2.operate();

}}111111STRATEGY-策略模式策略模式針對一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化。策略模式把行為和環(huán)境分開。環(huán)境類負(fù)責(zé)維持和查詢行為類,各種算法在具體的策略類中提供。由于算法和環(huán)境獨(dú)立開來,算法的增減,修改都不會(huì)影響到環(huán)境和客戶端。與State較象,類中封裝算法,定義一組算法。112112113113STRATEGY-策略模式參與者Strategy定義所有支持的算法的公共接口。Context使用這個(gè)接口來調(diào)用某ConcreteStrategy定義的算法。ConcreteStrategy以Strategy接口實(shí)現(xiàn)某具體算法。Context用一個(gè)ConcreteStrategy對象來配置維護(hù)一個(gè)對Strategy對象的引用可定義一個(gè)接口來讓Strategy訪問它的數(shù)據(jù)114114STRATEGY-策略模式協(xié)作Strategy和Context相互作用以實(shí)現(xiàn)選定的算法。Context將它的客戶的請求轉(zhuǎn)發(fā)給Strategy。115115publicabstractclassRepTempRule{

protectedStringoldString="";

publicvoidsetOldString(StringoldString){

this.oldString=oldStrin

溫馨提示

  • 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)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論