Java23種設(shè)計模式_第1頁
Java23種設(shè)計模式_第2頁
Java23種設(shè)計模式_第3頁
Java23種設(shè)計模式_第4頁
Java23種設(shè)計模式_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Java設(shè)計模式目錄1. 設(shè)計模式31.1 創(chuàng)建型模式41.1.1 工廠方法41.1.2 抽象工廠61.1.3 建造者模式101.1.4 單態(tài)模式131.1.5 原型模式151.2 結(jié)構(gòu)型模式171.2.1 適配器模式171.2.2 橋接模式191.2.3 組合模式231.2.4 裝飾模式261.2.5 外觀模式291.2.6 享元模式321.2.7 代理模式341.3 行為型模式371.3.1 責(zé)任鏈模式371.3.2 命令模式401.3.3 解釋器模式431.3.4 迭代器模式451.3.5 中介者模式491.3.6 備忘錄模式521.3.7 觀察者模式541.3.8 狀態(tài)模式581.3.

2、9 策略模式611.3.10 模板方法631.3.11 訪問者模式651. 設(shè)計模式(超級詳細(xì))內(nèi)容簡介 有感于設(shè)計模式在日常開發(fā)中的重要性,同時筆者也自覺對設(shè)計模式小有心得,故筆者*寫二十三種設(shè)計模式的簡單例子、并整理二十三種設(shè)計模式的理論部分,綜合匯總成這份Java設(shè)計模式(瘋狂J*va聯(lián)盟版),希望對大家有所幫助。 本份幫助文檔主要是為了向讀者介紹二十三種設(shè)計模式,包括模式的描述,適用性,模*的組成部分,并附帶有簡單的例子和類*,目的是為了讓讀*了解二十三種*計模式,并能方便的查閱各種設(shè)計模*的用法及注意點。 所附的例子非常簡單,慢慢的引導(dǎo)讀者從淺到深了解設(shè)計模式,并能從中享受設(shè)計的樂趣

3、。 由于每個人對設(shè)計*式的理解都不盡一致,因此,可能本文檔的例子*有不恰當(dāng)?shù)牡胤?,還望各位讀者指出不恰當(dāng)?shù)牡胤健g迎登錄瘋狂J*va聯(lián)盟進(jìn)行技術(shù)交流,瘋狂Java聯(lián)盟的論壇宗旨是:1.1 創(chuàng)建型模式AbstractFactory ( 抽象工廠 ) FactoryMethod ( 工廠方法 ) Singleton ( 單態(tài)模式 ) Builder ( 建造者模式 ) Protot*pe * 原型模式 ) 1.1.1 工廠方法 定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。FactoryMethod使一個類的實例化延遲到其子類。 適用性 1.當(dāng)一個類不知道它所必須創(chuàng)建的對象的類的

4、時候。 2.當(dāng)一個類希望由它的子類來指定它所創(chuàng)建的對象的時候。 3.當(dāng)*將創(chuàng)建對象的職責(zé)委托給多個幫助*類中的某一個,并且*希望將哪一個幫助子類是代理者這一信息局部化的時候。 參與者 1.Product 定義工廠方法所創(chuàng)建的對象的接口。 2.ConcreteProduct 實現(xiàn)Product接口。 3.Creator 聲明工廠方法,該方法返回一個Product類型的對象* Creator也可以定義一個工廠方法的缺省實現(xiàn),它返回一個缺省的ConcreteProduct對象。 可以調(diào)用工廠方法以創(chuàng)建一個Product對象。 4.ConcreteCreator 重定義工廠方法以返回一個Co

5、ncreteProduct實例。 類圖 例子*roduct public interface Work void doWork();ConcreteProduct public class StudentWork implements Work public void doWork() System.out.println("學(xué)生*作業(yè)!"); public class TeacherWork implements Work public void doWork() System.out.println("老師審批作業(yè)!"); Cre

6、ator public interface IWorkFactory Work get*ork();Concre*eCreator pu*lic class StudentWorkFactory implements IWorkFactory public Work getWork() *eturn new StudentWork(); public class TeacherWorkFactory implements IWorkFactory public Work getWork() return new TeacherWork(); Test public class Test pub

7、lic static void m*in(Strin* args) IWorkFactory studentWorkFactory = new StudentWorkFactory(); studentWorkFactory.getWork().d*Work(); IWorkFactory teacherWorkFactory * new TeacherWorkFactory(); teacherWorkFactory.g*tWork().*oWork(); result 學(xué)生做作業(yè)!老師審批作業(yè)!1.1.2 抽象工廠 提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。

8、60;適用性 1.一個系統(tǒng)要獨立于它的*品的創(chuàng)建、組合和表示時。 2.一個系統(tǒng)要由多個產(chǎn)品系列中的一個來配置時。 3.當(dāng)你要強調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計以便進(jìn)行聯(lián)合使用時* 4*當(dāng)你提供一個產(chǎn)品類庫,而只想顯示它們*接口而不是實現(xiàn)時。 參與者 1.Ab*tractFactory 聲明一個創(chuàng)建抽象產(chǎn)品對象的操作接口。 2.ConcreteFactory 實現(xiàn)創(chuàng)建具體產(chǎn)品對象的操作。 *.AbstractProduct 為一類產(chǎn)品對象聲明一個接口。 4.ConcreteProdu*t 定義一個將被相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品*象。 實現(xiàn)*bstractProduct接口。 5.Client

9、 僅使用由AbstractFactory和AbstractProduc*類聲明的接口 類圖 例子*bstractFactory public interface IAn*malFactory ICat createCat(); IDog createDog();ConcreteFactory p*blic class BlackAnimalFactory implem*nts IAnimalFactory public ICat createCat() retur* new BlackCat(); public IDog createDog() return new Bla

10、ckDog(); public class WhiteAnimalFac*ory imp*ements IAnimalFactory public ICat createCat() return new WhiteCat(); public IDog cre*teDog() return new WhiteDog(); Abstrac*Product public interface ICat void eat();public interface IDog void eat();Concrete*roduct public class Black*at implements ICat pub

11、lic 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 eating!*); public class BlackDog implements IDog public void eat() System.out.println("The black dog is eating"); publi

12、c 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 BlackAnimalFactory(); ICat blackCat = blackAnimalFactory.createCat(); blackCat.eat(); IDog blackD*g = black

13、AnimalFactory.createDog(); blackDog.eat(); IAnimalFactory whiteAnimalF*ctory = new WhiteAnimalFactory(); ICat whiteCat = whiteAnimalFactory.createCat(); whiteCat.eat(); IDog *hiteDog = whiteAnimalFactory.createDog(); whiteDog.eat();res*lt The bla*k cat is eating!Th* black dog is eatin*!The white cat

14、 is eating!The white dog is *ating!1.1.3 建造者模式 將一個復(fù)雜對象的構(gòu)*與它的表示分離,使*同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 適用性 1.當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨立于該對象的組成部分以及它們的裝配方式時。 *.當(dāng)構(gòu)造過程必須允*被構(gòu)造的對象有不同*表示時。 參與者 1.Builder 為創(chuàng)建一個Product對象的各個部件指定抽象接口。 2.ConcreteBuilder 實現(xiàn)Buil*er的接口以構(gòu)造和裝配該產(chǎn)品的各個部件。 定義并明確它所創(chuàng)建的表示* 提供一個檢索產(chǎn)品的接口。 3.Director 構(gòu)造一個使用Builder

15、接口的對象。 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 buildPerson();ConcreteBuilder public class ManBuilder implements PersonB*ilder Person perso

16、n; 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() retur* person; Dir*ctor public class PersonDirec

17、*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; public void setHead(String hea*) this.head = he

18、ad; 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 main(String ar*s) PersonDirector pd = new Pers

19、onDirector(); 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)模式 保證一個類僅有一個實例,*提供一個訪問它的全局訪*點。 適用性 1.當(dāng)類只能有一個*例而且客戶可以從一個眾所周知的訪問點訪問它時。 2.當(dāng)這個唯一實例應(yīng)該是通過

20、子類化可擴展的,并且客戶應(yīng)該無需更改代碼就能使用一個擴展的實例時。 參與者 Singleton 定義一個Instance操作,允許客戶訪問它的唯一實例。Instance是一個類操作。 可能負(fù)*創(chuàng)建它自己的唯一實例。 類圖 例子Singleton public class Singleton private static Singleton sing; private Singleton() public st*tic Singleton get*nstance() if (sing = null) sing = new Singleto*(); return si

21、ng; 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 原型模式 用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新

22、的對象。 適用性 1.當(dāng)一個系統(tǒng)應(yīng)該獨立于它的產(chǎn)品創(chuàng)*、構(gòu)成和表示時。 2.當(dāng)要實例化的類是在運行時刻指定時,例如,通過動態(tài)裝載。 3.為了避免創(chuàng)建一個與產(chǎn)品類層次平行的工廠*層次時。 4.當(dāng)一個類的實例只能有幾個不同狀態(tài)組合中的一種時。 建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實例化該類更方便一些。 參與者 1. Prototype 聲明一個克隆自身的接口。 2. ConcretePrototype 實現(xiàn)一個克隆自身的操作。 3. Client 讓一個原型克*自身從而創(chuàng)建一個新的對象。 類圖 例子Prototype public clas

23、s 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 ex

24、tend* Prototype public 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

25、(); result prototypeprototype1.2 結(jié)構(gòu)型模式Adapter * 適配器模式 * Bridge ( 橋接模* ) Composite ( 組合模式 ) Decorator ( 裝*模式 ) Facade ( 外觀模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) 1.2.1 適配器模式 將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。Adapter模式使得原本由于接口*兼容而不能一起工作的那*類可以一起工作。 適用性 1.你想使*一個已經(jīng)存在的類,而它的接口不符合你的需求。 2.你想創(chuàng)建一個可以復(fù)用的類,該類可以與其他不相關(guān)的類或不

26、可預(yù)見的類(即那*接口 可能不一定兼容的類)協(xié)同工作。 *.(僅適用于對象Adapter)你想使用一些已經(jīng)存在的子類,但是不可能對每一個都進(jìn)行 子類化以匹配它們的接口。對象適配器可以適配它的父類接口。 參與者 1.Target 定義Client使用的與特定領(lǐng)域相關(guān)的接口。 2.Client 與符合Target接口的對象協(xié)同。 3.Adapt*e 定義一個已經(jīng)存在的接口,這個接口需要適配。 4.Adapter 對Adaptee的接口與Target接口進(jìn)行適配 類圖 例子Target public interface Target void adapteeMethod

27、(); void adapterMethod();Adaptee public class Adaptee public 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.adapt

28、eeMethod();public void adapterMethod() *ystem.out.println("Adapter method!"); 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 橋接模式 將抽象部分與它*實現(xiàn)部

29、分分離,使它們都可以獨立地變化。 適用性 1.你不希望在抽*和它的實現(xiàn)部分之間有一個固定的綁定關(guān)系。 例如這種情況可能是因為,在程序運行時刻實現(xiàn)部分應(yīng)可以*選擇或者切換。 2.類的抽象以及它的實現(xiàn)都應(yīng)該可以通*生成子類的方法加以擴充。 這時Bridge模式使你可以對不同的抽象接口和實現(xiàn)部分進(jìn)行組合,并分別對它們進(jìn)行擴充。 3.對一個抽象的實現(xiàn)部分的修改應(yīng)對客戶不產(chǎn)生影響,即客戶的代碼不必重新編譯。 4.正如在意圖一節(jié)的第一個類圖中所示的那樣,有許多類要生成。 這*一種類層次結(jié)構(gòu)說明你必須將一個對象分解成兩個部分。 5.*想在多個對象間共享實現(xiàn)(可能使用引用計數(shù)),但同時要求客戶并不知

30、*這一點。 參與者 1.Abstraction 定義抽象類的接口。 維護一個指向Implementor類型對象的指針。 2.RefinedAbstraction 擴充由Abstraction定義的接口。 3.Implementor 定義實現(xiàn)類的接口,該接口不一定要與Ab*traction的接口完全一致。 事實上這兩個接口可以完全不同。 *般來講,Implementor接口僅提供基本操作,而Abstraction則定義了基于這些基本操作的較高層次的操作。 4.ConcreteImplementor *現(xiàn)Implementor接口并定義它的具體實現(xiàn)。 類圖 例子Abs

31、tr*ction public abstract class Person private Clothing clothing; pr*vate String type; public Clothing getClothing() 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; p

32、ublic abstract void dress();RefinedAbstraction public class Man extends *erson public Man() setType("男人"); public void dress() Clothing clothing = get*lothing(); clothing.personDressCloth(this); public class Lady extends Person public Lady() setTyp*("女人"); public void dress() Clo

33、th*ng clothing = getClothing(); c*othing.personDressCloth(this); Implemento* public abstract class Clothing public abstract void personDressC*oth(*erson person);ConcreteImplemento* public class *ack*t extends Clothing public void personDressCloth(Person person) System.out.println(person.getType() +

34、"穿馬甲"); public cl*ss Trouser extends Clothing public void personDressCloth(Person person) System.ou*.println(*erson.getType() + "穿褲子"); 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(); Cl

35、ot*ing trouser = new Trouser(); jacket.personDressCloth(man); trouser.personDressCloth(man); j*cket.personDressCloth(lady); trouser.personDressCloth(lady); result 男人穿馬甲男人穿褲子女人穿馬甲女人穿褲子1.2.3 組合模式 將對象組合成樹形結(jié)構(gòu)以表示"部分-整體"的層次結(jié)構(gòu)。"Composite使得用戶對單個對象和組合對*的使用具有一致性。" 適用性 1.你想表示對象的部分-整*層次

36、結(jié)構(gòu)。 2.你希望用戶忽略組合對象與單個對象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對象。 參與者 1.Component 為組合中的對象聲明接口。 在適當(dāng)?shù)那闆r下,實現(xiàn)所有類共有接口的缺省行為。 聲明一個接口用于訪問和管理Component的子組件。 (可選)在遞歸結(jié)構(gòu)中定義一個接口,用于訪問一個父部件,并在合*的情況下實現(xiàn)它。 2.Leaf 在組合中表示葉節(jié)點對象,葉節(jié)點沒有子節(jié)點。 在組合中定義節(jié)點對象的行為。 3.Compos*te 定義有子部件的*些部件的行為。 存儲子部件。 在Component接口中實現(xiàn)與子部件有*的操作。 4.Client 通過Component接*操

37、縱組合部件的對象。 類圖 例子Component p*blic abstract class Employer private String name; public void setName(String name) = *ame; public String getName() return ; public abstract void add(Employer employer*; public abstract void delete(Employer employer); public List employers; publ

38、ic 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;/程序員, 表示沒有下屬了 public v*id add(Employer employer) public void delete(Employer employer) public c

39、lass Pro*ectAssistant extends Employer public ProjectAss*stant(String name) setName(name); employers = *ull;/項目助理, 表示沒有下屬了 public void add(Employer employer) public void delet*(Employer employer) Composite public class Project*anager extends E*ployer public ProjectManager(String name) setName(name);

40、 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) Employer pm = new ProjectManager("項目經(jīng)理"); Emplo*er pa = new ProjectAssis

41、tant("項目助理"); Employer progra*mer1 = new Programmer("程序員一"); Employer programmer2 = new Programmer("程序員二"); pm.add(pa);/為項目經(jīng)理添加項目助理 pm.add(programmer2);/*項目經(jīng)理*加程序員 List ems = pm.getEm*loyers(); for (Employer em : ems) System.out.println(em.getNam*(); *result 項目助理程序員二1.2

42、.4 裝飾模式 動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說,Decorator模*相比生成子類更為*活。 適用性 1.在不影響其他*象的情況下,以動態(tài)、透明的方式給單個對象添加職責(zé)。 2.處理那些可以撤消的職責(zé)。 3.當(dāng)不能采用生成子類的方法進(jìn)行擴充時。 參與者 1.Component 定義一個對象接口,可以給這些對象動態(tài)地添加職責(zé)。 2.ConcreteComponent 定義一個對象,可以給這個對象添加一些職責(zé)。 3.Decorator 維持一個指向Component對象的指針,并定義一個與Component接口一致的接口。 4.ConcreteDecorato

43、r 向組件添加職責(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

44、) this.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 extend

45、s Decorator * public void eat() 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 男人在吃再吃一頓飯ManDecoratorA類=ManDecoratorB類1.2.5 外觀模式 為子系統(tǒng)中的一組接口提供一個一致的界面,F(xiàn)acade模式定義了一個高層接口,這個接口使得這*子系統(tǒng)更加容易使用。 適用性 1.當(dāng)你要為一個*雜子系統(tǒng)提供一個簡單接口時。子系統(tǒng)往往因為不斷演化而變得越來越 復(fù)雜。大多數(shù)模式使用時

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論