




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、PAGE Java設(shè)計(jì)模式(瘋狂Java聯(lián)盟版)Java設(shè)計(jì)模式(瘋狂Java聯(lián)盟版)PAGE 87目錄 TOC o 1-3 h z u HYPERLINK l _Toc266729529 1. 設(shè)計(jì)模式 PAGEREF _Toc266729529 h 3 HYPERLINK l _Toc266729530 1.1 創(chuàng)建型模式 PAGEREF _Toc266729530 h 4 HYPERLINK l _Toc266729531 1.1.1 工廠方法 PAGEREF _Toc266729531 h 4 HYPERLINK l _Toc266729532 1.1.2 抽象工廠 PAGEREF _
2、Toc266729532 h 6 HYPERLINK l _Toc266729533 1.1.3 建造者模式 PAGEREF _Toc266729533 h 10 HYPERLINK l _Toc266729534 1.1.4 單態(tài)模式 PAGEREF _Toc266729534 h 13 HYPERLINK l _Toc266729535 1.1.5 原型模式 PAGEREF _Toc266729535 h 15 HYPERLINK l _Toc266729536 1.2 結(jié)構(gòu)型模式 PAGEREF _Toc266729536 h 17 HYPERLINK l _Toc266729537 1
3、.2.1 適配器模式 PAGEREF _Toc266729537 h 17 HYPERLINK l _Toc266729538 1.2.2 橋接模式 PAGEREF _Toc266729538 h 19 HYPERLINK l _Toc266729539 1.2.3 組合模式 PAGEREF _Toc266729539 h 23 HYPERLINK l _Toc266729540 1.2.4 裝飾模式 PAGEREF _Toc266729540 h 26 HYPERLINK l _Toc266729541 1.2.5 外觀模式 PAGEREF _Toc266729541 h 29 HYPERL
4、INK l _Toc266729542 1.2.6 享元模式 PAGEREF _Toc266729542 h 32 HYPERLINK l _Toc266729543 1.2.7 代理模式 PAGEREF _Toc266729543 h 34 HYPERLINK l _Toc266729544 1.3 行為型模式 PAGEREF _Toc266729544 h 37 HYPERLINK l _Toc266729545 1.3.1 責(zé)任鏈模式 PAGEREF _Toc266729545 h 37 HYPERLINK l _Toc266729546 1.3.2 命令模式 PAGEREF _Toc2
5、66729546 h 40 HYPERLINK l _Toc266729547 1.3.3 解釋器模式 PAGEREF _Toc266729547 h 43 HYPERLINK l _Toc266729548 1.3.4 迭代器模式 PAGEREF _Toc266729548 h 45 HYPERLINK l _Toc266729549 1.3.5 中介者模式 PAGEREF _Toc266729549 h 49 HYPERLINK l _Toc266729550 1.3.6 備忘錄模式 PAGEREF _Toc266729550 h 52 HYPERLINK l _Toc266729551
6、1.3.7 觀察者模式 PAGEREF _Toc266729551 h 54 HYPERLINK l _Toc266729552 1.3.8 狀態(tài)模式 PAGEREF _Toc266729552 h 58 HYPERLINK l _Toc266729553 1.3.9 策略模式 PAGEREF _Toc266729553 h 61 HYPERLINK l _Toc266729554 1.3.10 模板方法 PAGEREF _Toc266729554 h 63 HYPERLINK l _Toc266729555 1.3.11 訪問者模式 PAGEREF _Toc266729555 h 651.
7、設(shè)計(jì)模式(超級詳細(xì))內(nèi)容簡介 有感于設(shè)計(jì)模式在日常開發(fā)中的重要性,同時(shí)筆者也自覺對設(shè)計(jì)模式小有心得,故筆者*寫二十三種設(shè)計(jì)模式的簡單例子、并整理二十三種設(shè)計(jì)模式的理論部分,綜合匯總成這份Java設(shè)計(jì)模式( HYPERLINK t _blank 瘋狂J*va聯(lián)盟版),希望對大家有所幫助。 本份幫助文檔主要是為了向讀者介紹二十三種設(shè)計(jì)模式,包括模式的描述,適用性,模*的組成部分,并附帶有簡單的例子和類*,目的是為了讓讀*了解二十三種*計(jì)模式,并能方便的查閱各種設(shè)計(jì)模*的用法及注意點(diǎn)。 所附的例子非常簡單,慢慢的引導(dǎo)讀者從淺到深了解設(shè)計(jì)模式,并能從中享受設(shè)計(jì)的樂趣。 由于每個(gè)人對設(shè)計(jì)*式的理解都不盡
8、一致,因此,可能本文檔的例子*有不恰當(dāng)?shù)牡胤?,還望各位讀者指出不恰當(dāng)?shù)牡胤健g迎登錄 HYPERLINK t _blank 瘋狂J*va聯(lián)盟進(jìn)行技術(shù)交流, HYPERLINK t _blank 瘋狂Java聯(lián)盟的論壇宗旨是: 所有的技術(shù)發(fā)帖,均有回復(fù)。 HYPERLINK t _blank 瘋狂Java聯(lián)盟網(wǎng)址: HYPERLINK t _blank 筆者簡介 筆者曾師從李剛老師學(xué)習(xí)Java,現(xiàn)居廣州。對Java軟件開發(fā)、各種Java開源技術(shù)都非常感興趣,曾參與開發(fā)、主持*發(fā)過大量Java、Java EE項(xiàng)目,對Java、Java *E項(xiàng)目有一定認(rèn)識*見解。歡迎大家與筆者就Java、Java
9、EE相*方面進(jìn)行技術(shù)交流。 筆者現(xiàn)為 HYPERLINK t _blank 瘋狂Jav*聯(lián)盟的總版主(論壇ID:楊恩雄),也希望通過該平臺與大家分享Java、Java EE技術(shù)、*得。 本人郵箱: HYPERLINK mailto: 聲明 本文檔編寫、制作過程中得到了 HYPERLINK t _blank 瘋狂Java聯(lián)盟、以及筆者學(xué)習(xí)工作過程大量朋友的支持,大家都抱著一個(gè)目的:為國內(nèi)軟件軟件開發(fā)事業(yè)作出綿薄貢獻(xiàn)。 我們在此鄭重宣布,本*檔遵循Apache 2.0協(xié)議。在完整保留全部文本(包括本版權(quán)頁),并且不違反Apache 2.0協(xié)議的前提下,允許和鼓勵(lì)任何人進(jìn)行全文轉(zhuǎn)載及推廣,我們放棄除
10、署名權(quán)外的一切權(quán)利。1.1 創(chuàng)建型模式AbstractFactory ( 抽象工廠 ) FactoryMethod ( 工廠方法 ) Singleton ( 單態(tài)模式 ) Builder ( 建造者模式 ) Protot*pe * 原型模式 ) 1.1.1 工廠方法 *義一個(gè)用于創(chuàng)建對象的接口,讓子類決定實(shí)例化哪一個(gè)類。FactoryMethod使一個(gè)類的實(shí)例*延遲到其子類。適用性 1.當(dāng)一個(gè)類不知道它所必須創(chuàng)建的對象的類的時(shí)候。 2.當(dāng)一個(gè)類希望由它的子類來指定它所創(chuàng)建的對象的時(shí)候。 3.當(dāng)*將創(chuàng)建對象的職責(zé)委托給多個(gè)幫助*類中的某一個(gè),并且*希望將哪一個(gè)幫助子類是代理者這一信息局部化的時(shí)候
11、。參與者 1.Product 定義工廠方法所創(chuàng)建的對象的接口。 2.ConcreteProduct 實(shí)現(xiàn)Product接口。 3.Creator 聲明工廠方法,該方法返回一個(gè)Product類型的對象* Creator也可以定義一個(gè)工廠方法的缺省實(shí)現(xiàn),它返回一個(gè)缺省的ConcreteProduct對象。 可以調(diào)用工廠方法以創(chuàng)建一個(gè)Product對象。 4.ConcreteCreator 重定義工廠方法以返回一個(gè)ConcreteProduct實(shí)例。類圖例子*roduct public interface Work void doWork();ConcreteProduct public class
12、 StudentWork implements Work public void doWork() System.out.println(學(xué)生*作業(yè)!); public class TeacherWork implements Work public void doWork() System.out.println(老師審批作業(yè)!); Creator public interface IWorkFactory Work get*ork();Concre*eCreator pu*lic class StudentWorkFactory implements IWorkFactory public
13、 Work getWork() *eturn new StudentWork(); public class TeacherWorkFactory implements IWorkFactory public Work getWork() return new TeacherWork(); Test public class Test public static void m*in(Strin* args) IWorkFactory studentWorkFactory = new StudentWorkFactory(); studentWorkFactory.getWork().d*Wor
14、k(); IWorkFactory teacherWorkFactory * new TeacherWorkFactory(); teacherWorkFactory.g*tWork().*oWork(); result 學(xué)生做作業(yè)!老師審批作業(yè)!1.1.2 抽象工廠 提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。適用性 1.一個(gè)系統(tǒng)要獨(dú)立于它的*品的創(chuàng)建、組合和表示時(shí)。 2.一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來配置時(shí)。 3.當(dāng)你要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)* 4*當(dāng)你提供一個(gè)產(chǎn)品類庫,而只想顯示它們*接口而不是實(shí)現(xiàn)時(shí)。參與者 1.Ab*tractFa
15、ctory 聲明一個(gè)創(chuàng)建抽象產(chǎn)品對象的操作接口。 2.ConcreteFactory 實(shí)現(xiàn)創(chuàng)建具體產(chǎn)品對象的操作。 *.AbstractProduct 為一類產(chǎn)品對象聲明一個(gè)接口。 4.ConcreteProdu*t 定義一個(gè)將被相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品*象。 實(shí)現(xiàn)*bstractProduct接口。 5.Client 僅使用由AbstractFactory和AbstractProduc*類聲明的接口類圖例子*bstractFactory public interface IAn*malFactory ICat createCat(); IDog cre*teDog();ConcreteFac
16、tory p*blic class BlackAnimalFactory implem*nts IAnimalFactory public ICat createCat() retur* new BlackCat(); public IDog createDog() return new BlackDog(); public class WhiteAnimalFac*ory imp*ements IAnimalFactory public ICat createCat() return new WhiteCat(); public IDog cre*teDog() return new Whi
17、teDog(); Abstrac*Product public interface ICat void eat();public interface IDog void eat();Concrete*roduct public class Black*at implements ICat public void eat() System.out.println(The bl*ck cat is eating!); public class WhiteCat implements *Cat public void eat() Sy*tem.out.prin*ln(The w*ite cat is
18、 eating!*); public class BlackDog implements IDog public void eat() System.out.println(The black dog is eating); public class WhiteDog implements IDog public void eat() System.out.println(The white dog is eat*ng!); Client public static void main(String args) IAnimalFactory blackAnimalFa*tory = new B
19、lackAnimalFactory(); ICat blackCat = blackAnimalFactory.createCat(); blackCat.eat(); IDog blackD*g = blackAnimalFactory.createDog(); blackDog.eat(); IAnimalFactory whiteAnimalF*ctory = new WhiteAnimalFactory(); ICat whiteCat = whiteAnimalFactory.createCat(); whiteCat.eat(); IDog *hiteDog = whiteAnim
20、alFactory.createDog(); whiteDog.eat();res*lt The bla*k cat is eating!Th* black dog is eatin*!The white cat is eating!The white dog is *ating!1.1.3 建造者模式 將一個(gè)復(fù)雜對象的構(gòu)*與它的表示分離,使*同樣的構(gòu)建過程可以創(chuàng)建不同的表示。適用性 1.當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝配方式時(shí)。 *.當(dāng)構(gòu)造過程必須允*被構(gòu)造的對象有不同*表示時(shí)。參與者 1.Builder 為創(chuàng)建一個(gè)Product對象的各個(gè)部件指定抽象接口。 2.C
21、oncreteBuilder 實(shí)現(xiàn)Buil*er的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件。 定義并明確它所創(chuàng)建的表示* 提供一個(gè)檢索產(chǎn)品的接口。 3.Director 構(gòu)造一個(gè)使用Builder接口的對象。 4.Product 表示被構(gòu)造的復(fù)雜對象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程。 包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。類圖例子Buil*er public interface PersonBuilder void buildHead(); v*id buildBody(); void buildFoot()* Person buildPers
22、on();ConcreteBuilder public class ManBuilder implements PersonB*ilder Person person; public ManBuilder() person = ne* Man(); publ*c void build*ody() perso*.setBody(建造男人的身體); public void buildFoot() person.setFo*t(建造男人的腳); public void buildHead() pers*n.setHead(建造*人的頭); *ublic Person buildPerson() re
23、tur* person; Dir*ctor public class PersonDirec*or public Person constructPerson(PersonBuilder pb) pb.buildHead(); pb.buildBody(); pb.buildFoot(); return pb.buildPerson(); Product public class Person private String head; private String body; private String foot; public String getH*ad() return head; p
24、ublic void setHead(String hea*) this.head = head; public String getBody() return body; public void setBody(String body) this.b*dy = body; public String getFoot() return foot; public void setFoot(String foot) t*is.foot = foot; public class Man extends Person Test publ*c class Test public static void
25、main(String ar*s) PersonDirector pd = new PersonDirector(); Person person = pd.constructPerson(new ManBuilder(); System*out.println(person.getBody(); System.out.println(person.getFoot(); System.out.println(person.getHead(); result 建造男人*身體建造男*的腳建造男人的頭1.1.4 單態(tài)模式 保證一個(gè)類僅有一個(gè)實(shí)例,*提供一個(gè)訪問它的全局訪*點(diǎn)。適用性 1.當(dāng)類只能有一
26、個(gè)*例而且客戶可以從一個(gè)眾所周知的訪問點(diǎn)訪問它時(shí)。 2.當(dāng)這個(gè)唯一實(shí)例應(yīng)該是通過子類化可擴(kuò)展的,并且客戶應(yīng)該無需更改代碼就能使用一個(gè)擴(kuò)展的實(shí)例時(shí)。參與者 Singleton 定義一個(gè)Instance操作,允許客戶訪問它的唯一實(shí)例。Instance是一個(gè)類操作。 可能負(fù)*創(chuàng)建它自己的唯一實(shí)例。類圖例子Singleton public class Singleton private static Singleton sing; private Singleton() public st*tic Singleton get*nstance() if (sing = null) sing = new
27、Singleto*(); return sing; Test public class Test public static void *ain(*tring args) Singleton sing = Singleton.getInstance(); Singleton si*g2 = Singleton.getI*stance(); System.out.println(sing); System.out.pr*ntln(sing2); result singleton.Singleton1c78e57singleton.Singleton1c78e571.1.5 原型模式 用原型實(shí)例指
28、定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。適用性 1.當(dāng)一個(gè)系統(tǒng)應(yīng)該獨(dú)立于它的產(chǎn)品創(chuàng)*、構(gòu)成和表示時(shí)。 2.當(dāng)要實(shí)例化的類是在運(yùn)行時(shí)刻指定時(shí),例如,通過動態(tài)裝載。 3.為了避免創(chuàng)建一個(gè)與產(chǎn)品類層次平行的工廠*層次時(shí)。 4.當(dāng)一個(gè)類的實(shí)例只能有幾個(gè)不同狀態(tài)組合中的一種時(shí)。 建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些。參與者 1. Prototype 聲明一個(gè)克隆自身的接口。 2. ConcretePrototype 實(shí)現(xiàn)一個(gè)克隆自身的操作。 3. Client 讓一個(gè)原型克*自身從而創(chuàng)建一個(gè)新的對象。類圖例子Prototype public class
29、Prototype implements Cloneable private String name; public void setName(String name) = name; public String getName() return ; public Object clone() try return super.clone(); catch (Exception e) e.printStackTrace(); return null; ConcretePrototype publ*c class ConcretePrototype extend* Prototype publi
30、c ConcretePrototype(String name) setName(name); Client public clas* Test public static void main(String args) Prototype pro = new ConcretePrototy*e(prototype); Prototype pro2 = (Prototype)pro.clone(); *ystem.out.println(pro.getName()*; System.out.println(pro2.getName(); result prototypeprototype1.2
31、結(jié)構(gòu)型模式Adapter * 適配器模式 * Bridge ( 橋接模* ) Composite ( 組合模式 ) Decorator ( 裝*模式 ) Facade ( 外觀模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) 1.2.1 適配器模式 將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。Adapter模式使得原本由于接口*兼容而不能一起工作的那*類可以一起工作。適用性 1.你想使*一個(gè)已經(jīng)存在的類,而它的接口不符合你的需求。 2.你想創(chuàng)建一個(gè)可以復(fù)用的類,該類可以與其他不相關(guān)的類或不可預(yù)見的類(即那*接口 可能不一定兼容的類)協(xié)同工作。 *.(僅適用于對象Ad
32、apter)你想使用一些已經(jīng)存在的子類,但是不可能對每一個(gè)都進(jìn)行 子類化以匹配它們的接口。對象適配器可以適配它的父類接口。參與者 1.Target 定義Client使用的與特定領(lǐng)域相關(guān)的接口。 2.Client 與符合Target接口的對象協(xié)同。 3.Adapt*e 定義一個(gè)已經(jīng)存在的接口,這個(gè)接口需要適配。 4.Adapter 對Adaptee的接口與Target接口進(jìn)行適配類圖例子Target public interface Target void adapteeMethod(); void adapterMethod();Adaptee public class Adaptee pub
33、lic void adapteeMethod() Syste*.out.p*intln(Adaptee method!); Adapt*r public clas* Adapter implement* Target private Adap*ee adaptee; public Adapter(Adaptee adaptee) this.adapte* = adaptee; public void adapteeMethod() adaptee.adapteeMethod();public void adapterMethod() *ystem.out.println(Adapter met
34、hod!); Client public cla*s Test public stati* void main(String args) Target target = new Adapter(new Adaptee(); tar*et.adapteeMethod(); target.adapterM*thod(); result Adaptee method!Adapter method!1.2.2 橋接模式 將抽象部分與它*實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。適用性 1.你不希望在抽*和它的實(shí)現(xiàn)部分之間有一個(gè)固定的綁定關(guān)系。 例如這種情況可能是因?yàn)?,在程序運(yùn)行時(shí)刻實(shí)現(xiàn)部分應(yīng)可以*選擇或者
35、切換。 2.類的抽象以及它的實(shí)現(xiàn)都應(yīng)該可以通*生成子類的方法加以擴(kuò)充。 這時(shí)Bridge模式使你可以對不同的抽象接口和實(shí)現(xiàn)部分進(jìn)行組合,并分別對它們進(jìn)行擴(kuò)充。 3.對一個(gè)抽象的實(shí)現(xiàn)部分的修改應(yīng)對客戶不產(chǎn)生影響,即客戶的代碼不必重新編譯。 4.正如在意圖一節(jié)的第一個(gè)類圖中所示的那樣,有許多類要生成。 這*一種類層次結(jié)構(gòu)說明你必須將一個(gè)對象分解成兩個(gè)部分。 5.*想在多個(gè)對象間共享實(shí)現(xiàn)(可能使用引用計(jì)數(shù)),但同時(shí)要求客戶并不知*這一點(diǎn)。參與者 1.Abstraction 定義抽象類的接口。 維護(hù)一個(gè)指向Implementor類型對象的指針。 2.RefinedAbstraction 擴(kuò)充由Abst
36、raction定義的接口。 3.Implementor 定義實(shí)現(xiàn)類的接口,該接口不一定要與Ab*traction的接口完全一致。 事實(shí)上這兩個(gè)接口可以完全不同。 *般來講,Implementor接口僅提供基本操作,而Abstraction則定義了基于這些基本操作的較高層次的操作。 4.ConcreteImplementor *現(xiàn)Implementor接口并定義它的具體實(shí)現(xiàn)。類圖例子Abstr*ction public abstract class Person private Clothing clothing; pr*vate String type; public Clothing get
37、Clothing() return clothing; publi* void setClothing() this.clothing = *lothingFactory.getClothing(); public void setType(String type) t*is.type = type; public String getType() return this.ty*e; public abstract void dress();RefinedAbstraction public class Man extends *erson public Man() setType(男人);
38、public void dress() Clothing clothing = get*lothing(); clothing.personDressCloth(this); public class Lady extends Person public Lady() setTyp*(女人); public void dress() Cloth*ng clothing = getClothing(); c*othing.personDressCloth(this); Implemento* public abstract class Clothing public abstract void
39、personDressC*oth(*erson person);ConcreteImplemento* public class *ack*t extends Clothing public void personDressCloth(Person person) System.out.println(person.getType() + 穿馬甲); public cl*ss Trouser extends Clothing public void personDressCloth(Person person) System.ou*.println(*erson.getType() + 穿褲子
40、); Test public class Te*t public s*atic void main(String args) Person man = new Man(); Person lady = new Lady(); Clothing jacket = new Ja*ket(); Clot*ing trouser = new Trouser(); jacket.personDressCloth(man); trouser.personDressCloth(man); j*cket.personDressCloth(lady); trouser.personDressCloth(lady
41、); result 男人穿馬甲男人穿褲子女人穿馬甲女人穿褲子1.2.3 組合模式 將對象組合成樹形結(jié)構(gòu)以表示部分-整體的層次結(jié)構(gòu)。Composite使得用戶對單個(gè)對象和組合對*的使用具有一致性。適用性 1.你想表示對象的部分-整*層次結(jié)構(gòu)。 2.你希望用戶忽略組合對象與單個(gè)對象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對象。參與者 1.Component 為組合中的對象聲明接口。 在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的缺省行為。 聲明一個(gè)接口用于訪問和管理Component的子組件。 (可選)在遞歸結(jié)構(gòu)中定義一個(gè)接口,用于訪問一個(gè)父部件,并在合*的情況下實(shí)現(xiàn)它。 2.Leaf 在組合中表示葉節(jié)點(diǎn)對
42、象,葉節(jié)點(diǎn)沒有子節(jié)點(diǎn)。 在組合中定義節(jié)點(diǎn)對象的行為。 3.Compos*te 定義有子部件的*些部件的行為。 存儲子部件。 在Component接口中實(shí)現(xiàn)與子部件有*的操作。 4.Client 通過Component接*操縱組合部件的對象。類圖例子Component p*blic abstract class Employer private String name; public void setName(String name) = *ame; public String getName() return ; public abstract void add(Employer employ
43、er*; public abstract void delete(Employer employer); public List employers; public void printInfo*) System.out.println(name); *ublic List getE*ployers() return this.employers; Leaf public class Programmer extends Employer public Programmer(String name) setNam*(name); employers = null;/程序員, 表示沒有下屬了 p
44、ublic v*id add(Employer employer) public void delete(Employer employer) public class Pro*ectAssistant extends Employer public ProjectAss*stant(String name) setName(name); employers = *ull;/項(xiàng)目助理, 表示沒有下屬了 public void add(Employer employer) public void delet*(Employer employer) Composite public class P
45、roject*anager extends E*ployer public ProjectManager(String name) setName(name); employers = new A*rayList(); public void add(Employer employer) employers.add(employer); public void delete(Emplo*er employer) employers.remove(employer); Clie*t publ*c class Test public st*tic void main(String args) Em
46、ployer pm = new ProjectManager(項(xiàng)目經(jīng)理); Emplo*er pa = new ProjectAssistant(項(xiàng)目助理); Employer progra*mer1 = new Programmer(程序員一); Employer programmer2 = new Programmer(程序員二); pm.add(pa);/為項(xiàng)目經(jīng)理添加項(xiàng)目助理 pm.add(programmer2);/*項(xiàng)目經(jīng)理*加程序員 List ems = pm.getEm*loyers(); for (Employer em : ems) System.out.println(e
47、m.getNam*(); *result 項(xiàng)目助理程序員二1.2.4 裝飾模式 動態(tài)地給一個(gè)對象添加一些額外的職責(zé)。就增加功能來說,Decorator模*相比生成子類更為*活。適用性 1.在不影響其他*象的情況下,以動態(tài)、透明的方式給單個(gè)對象添加職責(zé)。 2.處理那些可以撤消的職責(zé)。 3.當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時(shí)。參與者 1.Component 定義一個(gè)對象接口,可以給這些對象動態(tài)地添加職責(zé)。 2.ConcreteComponent 定義一個(gè)對象,可以給這個(gè)對象添加一些職責(zé)。 3.Decorator 維持一個(gè)指向Component對象的指針,并定義一個(gè)與Component接口一致的接口
48、。 4.ConcreteDecorator 向組件添加職責(zé)。類圖例子Component public interface Person void eat();ConcreteComponent *ublic class M*n implements Person public void eat() System.out.println(男人在吃);*Decorator public abstrac* class Decorator implements Perso* protected Person person* public void setPerson(Person person) th
49、is.person = person; public void eat() person.eat(); ConcreteDec*rator publi* class ManDecoratorA extends Decorator public void eat() super.eat(); reEat(); Sy*tem.out.println(ManDecoratorA類); public void reEat() System.out.println(再吃一頓飯); *public class ManDecoratorB extends Decorator * public void ea
50、t() super.eat(); Syst*m.out.println(=); System.out.println(ManDecoratorB類); Test public class Test public st*tic void main(Strin* args) Man man = new Man(); ManDecoratorA md1 = new ManDecoratorA(); ManDecoratorB md2 = n*w ManDecoratorB(); md1.setPerson(man); md2.setPerson(md1); md2.eat(); result 男人在
51、吃再吃一頓飯ManDecoratorA類=ManDecoratorB類1.2.5 外觀模式 為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,F(xiàn)acade模式定義了一個(gè)高層接口,這個(gè)接口使得這*子系統(tǒng)更加容易使用。適用性 1.當(dāng)你要為一個(gè)*雜子系統(tǒng)提供一個(gè)簡單接口時(shí)。子系統(tǒng)往往因?yàn)椴粩嘌莼兊迷絹碓?復(fù)雜。大多數(shù)模式使用時(shí)都會產(chǎn)生更多更小的類。這使得子系統(tǒng)更具可重用性,也更容 易對子系統(tǒng)進(jìn)行定制,但這也給*些不需要定制子系統(tǒng)的用戶帶來一些使用上的困難。 Fa*ade可以提供一個(gè)簡單的缺省視圖,這一視圖對大多數(shù)用戶來說已經(jīng)足*,而那些需 要更多的可定制性的用戶可以越過facade層。 2.客戶程序與抽象
52、類的實(shí)現(xiàn)部分之間存在著很大的依賴性。引入facade將這個(gè)子系統(tǒng)與客 戶以及其他的子系統(tǒng)分離,可以提高子系統(tǒng)的獨(dú)立性和可移植性。 3.當(dāng)你需要構(gòu)建一個(gè)層次結(jié)構(gòu)的子系統(tǒng)時(shí),使用facade模式定義子系統(tǒng)中每層的入口點(diǎn)。 如果子系統(tǒng)之間是相互依賴的,你可以讓它們僅通過facade進(jìn)行通訊,從而簡化了它們 之間的依賴關(guān)系。參與者 1.Facade 知道哪些子系統(tǒng)類負(fù)責(zé)處理請求。 將客戶的請求代理給適當(dāng)?shù)淖酉到y(tǒng)對象。 2.Subsystemclasses 實(shí)現(xiàn)子系統(tǒng)的功能。 處理由Facade對象指派的任務(wù)。 沒有facade的任何相關(guān)信息;即沒有指向*acade的指針。類圖例子Facade publ
53、i* class Facade ServiceA s*; ServiceB sb; ServiceC sc; public Facade() sa = new S*rviceAImpl(); sb = new *erviceBImpl(); sc = new ServiceCImpl(); public void methodA() sa.methodA(); sb.methodB(); publi* void methodB() s*.methodB(); sc.methodC(); public void methodC() sc.methodC(); sa.methodA(); Subs
54、ystemclasse* public *lass ServiceAImpl implements ServiceA public void methodA() System.out.println(這是服務(wù)A); public class ServiceBImpl implements ServiceB public void methodB() System.out.println(這是服務(wù)B); *public class ServiceCImpl implements ServiceC public void methodC() System.out.println(這是服*C); T
55、est public class Test public static voi* main(String args) ServiceA sa = new ServiceAImpl(); Ser*iceB sb = new ServiceBImpl(); sa.metho*A(); sb.methodB(); System.out.println(=); /facade Facade facade = new Facade(); facade.methodA(); facade.methodB(); resu*t 這是服務(wù)A這是*務(wù)B=這是服務(wù)A這是服務(wù)B這是服務(wù)B這是服務(wù)C1.2.6 享元模式
56、 運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對象。適用性 當(dāng)都具備下列情況時(shí),使用Flyweight模式: 1.一個(gè)應(yīng)用程序使用了大量的*象。 2.完全由于使用大量的對象,造成很大的存儲開銷。 3.對象*大多數(shù)狀態(tài)都可變?yōu)橥獠繝顟B(tài)。 4.如果刪除對象的外部狀態(tài),那么可以*相對較少的共享對象取代很多組對象。 5.應(yīng)用程序不依賴于對象標(biāo)識。由于Flyweight對象可以被共享,對于*念上明顯有別的對象,標(biāo)識測試將返回真值。參與者 1.Flyweight 描述一個(gè)接口,通過這個(gè)接口flyweight可以接受并作用于外部狀態(tài)。 2.ConcreteFlyweight 實(shí)現(xiàn)Flyweight接口,并為內(nèi)部狀態(tài)(
57、如果有的話)增加存儲空間。 Concrete*lyweight對象必須是可共享的。它所存儲的狀態(tài)必須是內(nèi)部的;即,它必須獨(dú)立于ConcreteFlyweight對象的場景。 3.UnsharedConcreteFlyweigh* 并非所有的Flywe*ght子類都需要被共享。Flyweight接口使共享成為可能,但它并不強(qiáng)制共*。 在Flyweight對象結(jié)構(gòu)的某些層次,UnsharedConcreteFlyweight對象通常將ConcreteFlyweight對象作為子節(jié)點(diǎn)。 4.Flyweigh*Factory 創(chuàng)建并管理flywe*ght對象。 確保合理地共享flyweight。當(dāng)用戶
58、請求一個(gè)flywei*ht時(shí),F(xiàn)l*weightFactory對象提供一個(gè)已創(chuàng)建的實(shí)例或者創(chuàng)建一個(gè)(如果不存在的話)。類*例子Flyweight public int*rface Flyweight void a*tion(int arg);ConcreteFlyweight public class FlyweightImpl implements Flyweight public void action(int arg) / T*DO Auto-genera*ed method stub System.out.println(*參數(shù)值: + arg); FlyweightFactory p
59、ublic class Flyweigh*Factory private static Map flyweights = new HashMap(); public FlyweightF*ctory(String arg) flyweights.put(arg, new FlyweightImpl(); public static Flyweight getFly*eight(String key) if (flyweights.get(key) = null) flyweights.p*t(key, new FlyweightImpl(); return flyweights.get(key
60、); public static int g*tSize() retu*n flyweights.size(); Test public class Test public static v*id main(String args) / TODO Auto-generated method stub Flyweight fly1 = Flyw*ightFact*ry.getFlyweight(*a); fly1.action(1); Flyweight fly* = FlyweightFactory.getF*yweight(a); System.out.println(fly1 = fly2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 九江逆變器項(xiàng)目申請報(bào)告
- 2025年中國早餐機(jī)市場深度評估及行業(yè)投資前景咨詢報(bào)告
- 2025年少年宮市場調(diào)研報(bào)告
- 中國汽車物聯(lián)網(wǎng)行業(yè)市場深度分析及投資戰(zhàn)略規(guī)劃研究報(bào)告
- 中國藕粉行業(yè)市場發(fā)展現(xiàn)狀及前景趨勢與投資分析研究報(bào)告(2024-2030)
- 2025年中國電源浪涌保護(hù)器行業(yè)市場調(diào)查研究及投資策略研究報(bào)告
- 2025屆黑龍江省哈爾濱市南崗區(qū)第三中學(xué)校高二物理第二學(xué)期期末達(dá)標(biāo)檢測試題含解析
- 避暑安全課件
- 銷售發(fā)票開具管理辦法
- 銀行機(jī)構(gòu)衍生管理辦法
- 2023-2024學(xué)年北師大版八年級下冊期末數(shù)學(xué)試卷2(考試版)
- 小學(xué)五年級第一學(xué)期體育教案(新版)
- 大疆無人機(jī)租賃合同協(xié)議書
- HG∕T 4592-2014 離子膜法金屬陽極電解槽電極活性層
- 進(jìn)入車間管理制度
- 落地式腳手架搭設(shè)安全技術(shù)交底
- 急性肝衰竭的護(hù)理查房
- 2024年陜西延長石油延安能源化工有限責(zé)任公司招聘筆試參考題庫含答案解析
- 滴灌通白皮書
- FFR指導(dǎo)下多支血管病變處理策略
- 監(jiān)控安裝項(xiàng)目計(jì)劃書
評論
0/150
提交評論