版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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)模
2、式581.3.9 策略模式611.3.10 模板方法631.3.11 訪問者模式651. 設(shè)計模式內(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ù)牡胤?。歡迎登錄瘋狂J*va聯(lián)盟進行技術(shù)交流,瘋狂Java聯(lián)盟的論壇宗旨是: 所有的技術(shù)發(fā)帖,均有回復(fù)。 瘋狂Java聯(lián)盟網(wǎng)址:筆者簡介 筆者曾師從李剛老師學(xué)習(xí)Java,現(xiàn)居廣州。對Java軟件開發(fā)、各種Java開源技術(shù)都非常感興趣,曾參與開發(fā)、主持*發(fā)過大量Java、Java EE項目,對Java、Java *E項目有一定認識*見解。歡迎大家與筆者就Java、Java EE相*方面進行技術(shù)交流。 筆者現(xiàn)為瘋狂Jav*聯(lián)盟的總版主(論壇ID:楊恩雄
4、),也希望通過該平臺與大家分享Java、Java EE技術(shù)、*得。 本人郵箱: 聲明 本文檔編寫、制作過程中得到了瘋狂Java聯(lián)盟、以及筆者學(xué)習(xí)工作過程大量朋友的支持,大家都抱著一個目的:為國內(nèi)軟件軟件開發(fā)事業(yè)作出綿薄貢獻。 我們在此鄭重宣布,本*檔遵循Apache 2.0協(xié)議。在完整保留全部文本(包括本版權(quán)頁),并且不違反Apache 2.0協(xié)議的前提下,允許和鼓勵任何人進行全文轉(zhuǎn)載及推廣,我們放棄除署名權(quán)外的一切權(quán)利。1.1 創(chuàng)建型模式AbstractFactory ( 抽象工廠 ) FactoryMethod ( 工廠方法 ) Singleton (
5、單態(tài)模式 ) Builder ( 建造者模式 ) Protot*pe * 原型模式 ) 1.1.1 工廠方法 *義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。FactoryMethod使一個類的實例*延遲到其子類。適用性 1.當(dāng)一個類不知道它所必須創(chuàng)建的對象的類的時候。 2.當(dāng)一個類希望由它的子類來指定它所創(chuàng)建的對象的時候。 3.當(dāng)*將創(chuàng)建對象的職責(zé)委托給多個幫助*類中的某一個,并且*希望將哪一個幫助子類是代理者這一信息局部化的時候。參與者 1.Product 定義工廠方法所創(chuàng)建的對象的接口。 2.ConcreteProduct 實現(xiàn)Product接口。 3.Creator 聲明工廠方法
6、,該方法返回一個Product類型的對象* Creator也可以定義一個工廠方法的缺省實現(xiàn),它返回一個缺省的ConcreteProduct對象。 可以調(diào)用工廠方法以創(chuàng)建一個Product對象。 4.ConcreteCreator 重定義工廠方法以返回一個ConcreteProduct實例。類圖例子*roduct public interface Work void doWork();ConcreteProduct public class StudentWork implements Work public void doWork() System.out.println(學(xué)生*作業(yè)!); p
7、ublic 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 Work getWork() *eturn new StudentWork(); public class TeacherWorkFactory imple
8、ments 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*Work(); IWorkFactory teacherWorkFactory * new TeacherWorkFactory(); teacherWorkFac
9、tory.g*tWork().*oWork(); result 學(xué)生做作業(yè)!老師審批作業(yè)!1.1.2 抽象工廠 提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。適用性 1.一個系統(tǒng)要獨立于它的產(chǎn)品的創(chuàng)建、組合和表示時。 2.一個系統(tǒng)要由多個產(chǎn)品系列中的一個來配置時。 3.當(dāng)你要強調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計以便進行聯(lián)合使用時。 4當(dāng)你提供一個產(chǎn)品類庫,而只想顯示它們接口而不是實現(xiàn)時。參與者 1. AbstractFactory 聲明一個創(chuàng)建抽象產(chǎn)品對象的操作接口。 2.ConcreteFactory 實現(xiàn)創(chuàng)建具體產(chǎn)品對象的操作。 3.AbstractProduct 為一類產(chǎn)
10、品對象聲明一個接口。 4.ConcreteProduct 定義一個將被相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品對象。 實現(xiàn)abstractProduct接口。 5.Client 僅使用由AbstractFactory和AbstractProduct類聲明的接口類圖例子*bstractFactory public interface IAnimalFactory ICat createCat(); IDog createDog();ConcreteFactory public class BlackAnimalFactory implements IAnimalFactory public ICat creat
11、eCat() return new BlackCat(); public IDog createDog() return new BlackDog(); public class WhiteAnimalFactory implements IAnimalFactory public ICat createCat() return new WhiteCat(); public IDog createDog() return new WhiteDog(); AbstractProduct public interface ICat void eat();public interface IDog
12、void eat();Concrete*roduct public class Blackcat implements ICat public void eat() System.out.println(The black cat is eating!); public class WhiteCat implements ICat public void eat() System.out.println(The white cat is eating! ); public class BlackDog implements IDog public void eat() System.out.p
13、rintln(The black dog is eating); public class WhiteDog implements IDog public void eat() System.out.println(The white dog is eating!); Client public static void main(String args) IAnimalFactory blackAnimalFactory = new BlackAnimalFactory(); ICat blackCat = blackAnimalFactory.createCat(); blackCat.ea
14、t(); IDog blackDog = blackAnimalFactory.createDog(); blackDog.eat(); IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory(); ICat whiteCat = whiteAnimalFactory.createCat(); whiteCat.eat(); IDog whiteDog = whiteAnimalFactory.createDog(); whiteDog.eat();res*lt The bla*k cat is eating!Th* black d
15、og is eating!The white cat is eating!The white dog is eating!1.1.3 建造者模式 將一個復(fù)雜對象的構(gòu)建與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表示。適用性 1.當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨立于該對象的組成部分以及它們的裝配方式時。 2.當(dāng)構(gòu)造過程必須允許被構(gòu)造的對象有不同的表示時。參與者 1.Builder 為創(chuàng)建一個Product對象的各個部件指定抽象接口。 2.ConcreteBuilder 實現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個部件。 定義并明確它所創(chuàng)建的表示. 提供一個檢索產(chǎn)品的接口。 3.Director
16、構(gòu)造一個使用Builder接口的對象。 4.Product 表示被構(gòu)造的復(fù)雜對象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程。 包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。類圖例子Builder public interface PersonBuilder void buildHead(); void buildBody(); void buildFoot(); Person buildPerson();ConcreteBuilder public class ManBuilder implements PersonBuilder Person pers
17、on; public ManBuilder() person = new Man(); public void buildBody() person.setBody(建造男人的身體); public void buildFoot() person.setFoot(建造男人的腳); public void buildHead() person.setHead(建造*人的頭); public Person buildPerson() return person; Director public class PersonDirector public Person constructPerson(P
18、ersonBuilder 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 getHead() return head; public void setHead(String head) this.head = head; public String getBody() return
19、body; public void setBody(String body) this.body = body; public String getFoot() return foot; public void setFoot(String foot) this.foot = foot; public class Man extends Person Test public class Test public static void main(String args) PersonDirector pd = new PersonDirector(); Person person = pd.co
20、nstructPerson(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)該是通過子類化可擴展的,并且客戶應(yīng)該無需更改代碼就能使用一個擴展的實例時。參與者 Sing
21、leton 定義一個Instance操作,允許客戶訪問它的唯一實例。Instance是一個類操作。 可能負責(zé)創(chuàng)建它自己的唯一實例。類圖例子Singleton public class Singleton private static Singleton sing; private Singleton() public static Singleton getInstance() if (sing = null) sing = new Singleton(); return sing; Test public class Test public static void main(String a
22、rgs) Singleton sing = Singleton.getInstance(); Singleton sing2 = Singleton.getInstance(); System.out.println(sing); System.out.println(sing2); result singleton.Singleton1c78e57singleton.Singleton1c78e571.1.5 原型模式 用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。適用性 1.當(dāng)一個系統(tǒng)應(yīng)該獨立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時。 2.當(dāng)要實例化的類是在運行時刻指定時,例如,通過
23、動態(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 class Prototype implements Cloneable private String name; public void setName(String nam
24、e) = name; public String getName() return ; public Object clone() try return super.clone(); catch (Exception e) e.printStackTrace(); return null; ConcretePrototype public class ConcretePrototype extends Prototype public ConcretePrototype(String name) setName(name); Client public c
25、lass Test public static void main(String args) Prototype pro = new ConcretePrototyte(prototype); Prototype pro2 = (Prototype)pro.clone(); System.out.println(pro.getName(); System.out.println(pro2.getName(); result prototypeprototype1.2 結(jié)構(gòu)型模式Adapter ( 適配器模式) Bridge ( 橋接模式 ) Composite ( 組合模式 ) Decorat
26、or ( 裝飾模式 ) Facade ( 外觀模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) 1.2.1 適配器模式 將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。適用性 1.你想使用一個已經(jīng)存在的類,而它的接口不符合你的需求。 2.你想創(chuàng)建一個可以復(fù)用的類,該類可以與其他不相關(guān)的類或不可預(yù)見的類(即那接口 可能不一定兼容的類)協(xié)同工作。 3.(僅適用于對象Adapter)你想使用一些已經(jīng)存在的子類,但是不可能對每一個都進行 子類化以匹配它們的接口。對象適配器可以適配它的父類接口。參與者 1
27、.Target 定義Client使用的與特定領(lǐng)域相關(guān)的接口。 2.Client 與符合Target接口的對象協(xié)同。 3.Adaptee 定義一個已經(jīng)存在的接口,這個接口需要適配。 4.Adapter 對Adaptee的接口與Target接口進行適配類圖例子Target public interface Target void adapteeMethod(); void adapterMethod();Adaptee public class Adaptee public void adapteeMethod() System.out.println(Adaptee method!); Adap
28、ter public class Adapter implements Target private Adaptee adaptee; public Adapter(Adaptee adaptee) this.adaptee = adaptee; public void adapteeMethod() adaptee.adapteeMethod();public void adapterMethod() System.out.println(Adapter method!); Client public class Test public static void main(String arg
29、s) Target target = new Adapter(new Adaptee(); target.adapteeMethod(); target.adapterMethod(); result Adaptee method!Adapter method!1.2.2 橋接模式 將抽象部分與它實現(xiàn)部分分離,使它們都可以獨立地變化。適用性 1.你不希望在抽象和它的實現(xiàn)部分之間有一個固定的綁定關(guān)系。 例如這種情況可能是因為,在程序運行時刻實現(xiàn)部分應(yīng)可以選擇或者切換。 2.類的抽象以及它的實現(xiàn)都應(yīng)該可以通過生成子類的方法加以擴充。 這時Bridge模式使你可以對不同的抽象接口和實現(xiàn)部分進行組合,
30、并分別對它們進行擴充。 3.對一個抽象的實現(xiàn)部分的修改應(yīng)對客戶不產(chǎn)生影響,即客戶的代碼不必重新編譯。 4.正如在意圖一節(jié)的第一個類圖中所示的那樣,有許多類要生成。 這一種類層次結(jié)構(gòu)說明你必須將一個對象分解成兩個部分。 5.想在多個對象間共享實現(xiàn)(可能使用引用計數(shù)),但同時要求客戶并不知道這一點。參與者 1.Abstraction 定義抽象類的接口。 維護一個指向Implementor類型對象的指針。 2.RefinedAbstraction 擴充由Abstraction定義的接口。 3.Implementor 定義實現(xiàn)類的接口,該接口不一定要與Abstraction的接口完全一致。 事實上這兩
31、個接口可以完全不同。 一般來講,Implementor接口僅提供基本操作,而Abstraction則定義了基于這些基本操作的較高層次的操作。 4.ConcreteImplementor 實現(xiàn)Implementor接口并定義它的具體實現(xiàn)。類圖例子Abstr*ction public abstract class Person private Clothing clothing; private String type; public Clothing getClothing() return clothing; public void setClothing() this.clothing =
32、ClothingFactory.getClothing(); public void setType(String type) this.type = type; public String getType() return this.type; public abstract void dress();RefinedAbstraction public class Man extends Person public Man() setType(男人); public void dress() Clothing clothing = getClothing(); clothing.person
33、DressCloth(this); public class Lady extends Person public Lady() setType(女人); public void dress() Clothing clothing = getClothing(); clothing.personDressCloth(this); Implemento* public abstract class Clothing public abstract void personDressCloth(Person person);ConcreteImplemento* public class Jacke
34、t extends Clothing public void personDressCloth(Person person) System.out.println(person.getType() + 穿馬甲); public class Trouser extends Clothing public void personDressCloth(Person person) System.out.println(person.getType() + 穿褲子); Test public class Test public static void main(String args) Person
35、man = new Man(); Person lady = new Lady(); Clothing jacket = new Jacket(); Clothing trouser = new Trouser(); jacket.personDressCloth(man); trouser.personDressCloth(man); jacket.personDressCloth(lady); trouser.personDressCloth(lady); result 男人穿馬甲男人穿褲子女人穿馬甲女人穿褲子1.2.3 組合模式 將對象組合成樹形結(jié)構(gòu)以表示部分-整體的層次結(jié)構(gòu)。Compo
36、site使得用戶對單個對象和組合對*的使用具有一致性。適用性 1.你想表示對象的部分-整體層次結(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.Composite 定義有子部件的一些部件的行為。 存儲子部件。 在Compone
37、nt接口中實現(xiàn)與子部件所有的操作。 4.Client 通過Component接口操縱組合部件的對象。類圖例子Component public abstract class Employer private String name; public void setName(String name) = name; public String getName() return ; public abstract void add(Employer employer); public abstract void delete(Employer employer)
38、; public List employers; public void printInfo() System.out.println(name); public List getEmployers() return this.employers; Leaf public class Programmer extends Employer public Programmer(String name) setName(name); employers = null;/程序員, 表示沒有下屬了 public void add(Employer employer) public void delet
39、e(Employer employer) public class ProcectAssistant extends Employer public ProjectAssistant(String name) setName(name); employers = null;/項目助理, 表示沒有下屬了 public void add(Employer employer) public void delete(Employer employer) Composite public class Projectmanager extends Employer public ProjectManage
40、r(String name) setName(name); employers = new ArrayList(); public void add(Employer employer) employers.add(employer); public void delete(Employer employer) employers.remove(employer); Clie*t public class Test public static void main(String args) Employer pm = new ProjectManager(項目經(jīng)理); Employer pa =
41、 new ProjectAssistant(項目助理); Employer programmer1 = new Programmer(程序員一); Employer programmer2 = new Programmer(程序員二); pm.add(pa);/為項目經(jīng)理添加項目助理 pm.add(programmer2);/為項目經(jīng)理添加程序員 List ems = pm.getEmployers(); for (Employer em : ems) System.out.println(em.getName(); result 項目助理程序員二1.2.4 裝飾模式 動態(tài)地給一個對象添加一些
42、額外的職責(zé)。就增加功能來說,Decorator模式相比生成子類更為靈活。適用性 1.在不影響其他對象的情況下,以動態(tài)、透明的方式給單個對象添加職責(zé)。 2.處理那些可以撤消的職責(zé)。 3.當(dāng)不能采用生成子類的方法進行擴充時。參與者 1.Component 定義一個對象接口,可以給這些對象動態(tài)地添加職責(zé)。 2.ConcreteComponent 定義一個對象,可以給這個對象添加一些職責(zé)。 3.Decorator 維持一個指向Component對象的指針,并定義一個與Component接口一致的接口。 4.ConcreteDecorator 向組件添加職責(zé)。類圖例子Component定義一個對象接口,
43、可以給這些對象動態(tài)地添加職責(zé)。public interface Person void eat();ConcreteComponent 定義一個對象,可以給這個對象添加一些職責(zé)。public class Man implements Person public void eat() System.out.println(男人在吃);Decorator 維持一個執(zhí)行Component對象的指針,并定義一個與Componect 接口一致的接口。public abstract class Decorator implements Person protected Person person; pub
44、lic void setPerson(Person person) this.person = person; public void eat() person.eat(); ConcreteDectrator 想組建添加職責(zé)public class ManDecoratorA extends Decorator public void eat() super.eat(); reEat(); System.out.println(ManDecoratorA類); public void reEat() System.out.println(再吃一頓飯); public class ManDecoratorB extends Decorator public void eat() super.eat(); System.out.
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安徽省心理咨詢室租賃合同
- 媒體制作加班內(nèi)容創(chuàng)新
- 國際農(nóng)業(yè)合作合同管理辦法
- 美甲店營業(yè)員勞動合同
- 醫(yī)療設(shè)施建設(shè)合同監(jiān)管
- 八年級道德與法治開學(xué)摸底考試卷(天津?qū)S茫ù痤}卡)A4版
- 水泥生產(chǎn)儲罐租賃合同
- 10.1 關(guān)心國家發(fā)展【幫課堂】2023-2024學(xué)年八年級道德與法治
- 動物園合同處理準(zhǔn)則
- 鐵路擴建工程圍擋施工協(xié)議
- 第四章-國防動員
- 北師大版五年級下冊數(shù)學(xué)分數(shù)除法練習(xí)100題及答案
- 體育賽事與城市發(fā)展協(xié)同研究
- 系統(tǒng)升級報告
- 財務(wù)會計理論 第7版 課件 第9、10章 沖突分析、管理人員薪酬
- 保安服務(wù)管理條例講座課件
- 甘肅省安全員-C證考試(專職安全員)題庫附答案
- 勞務(wù)經(jīng)濟人培訓(xùn)課件
- 輿情培訓(xùn)課件
- 無線電檢測方法和標(biāo)準(zhǔn)介紹
- 生物課程標(biāo)準(zhǔn):2023年義務(wù)教育版
評論
0/150
提交評論