




已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Java設計模式(瘋狂Java聯(lián)盟版)目錄1. 設計模式31.1 創(chuàng)建型模式41.1.1 工廠方法41.1.2 抽象工廠61.1.3 建造者模式101.1.4 單態(tài)模式131.1.5 原型模式151.2 結構型模式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 責任鏈模式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.9 策略模式611.3.10 模板方法631.3.11 訪問者模式651. 設計模式(超級詳細)內容簡介 有感于設計模式在日常開發(fā)中的重要性,同時筆者也自覺對設計模式小有心得,故筆者*寫二十三種設計模式的簡單例子、并整理二十三種設計模式的理論部分,綜合匯總成這份Java設計模式(瘋狂J*va聯(lián)盟版),希望對大家有所幫助。 本份幫助文檔主要是為了向讀者介紹二十三種設計模式,包括模式的描述,適用性,模*的組成部分,并附帶有簡單的例子和類*,目的是為了讓讀*了解二十三種*計模式,并能方便的查閱各種設計模*的用法及注意點。 所附的例子非常簡單,慢慢的引導讀者從淺到深了解設計模式,并能從中享受設計的樂趣。 由于每個人對設計*式的理解都不盡一致,因此,可能本文檔的例子*有不恰當?shù)牡胤?,還望各位讀者指出不恰當?shù)牡胤?。歡迎登錄瘋狂J*va聯(lián)盟進行技術交流,瘋狂Java聯(lián)盟的論壇宗旨是: 所有的技術發(fā)帖,均有回復。 瘋狂Java聯(lián)盟網址:筆者簡介 筆者曾師從李剛老師學習Java,現(xiàn)居廣州。對Java軟件開發(fā)、各種Java開源技術都非常感興趣,曾參與開發(fā)、主持*發(fā)過大量Java、Java EE項目,對Java、Java *E項目有一定認識*見解。歡迎大家與筆者就Java、Java EE相*方面進行技術交流。 筆者現(xiàn)為瘋狂Jav*聯(lián)盟的總版主(論壇ID:楊恩雄),也希望通過該平臺與大家分享Java、Java EE技術、*得。 本人郵箱: 聲明 本文檔編寫、制作過程中得到了瘋狂Java聯(lián)盟、以及筆者學習工作過程大量朋友的支持,大家都抱著一個目的:為國內軟件軟件開發(fā)事業(yè)作出綿薄貢獻。 我們在此鄭重宣布,本*檔遵循Apache 2.0協(xié)議。在完整保留全部文本(包括本版權頁),并且不違反Apache 2.0協(xié)議的前提下,允許和鼓勵任何人進行全文轉載及推廣,我們放棄除署名權外的一切權利。1.1 創(chuàng)建型模式AbstractFactory ( 抽象工廠 ) FactoryMethod ( 工廠方法 ) Singleton ( 單態(tài)模式 ) Builder ( 建造者模式 ) Protot*pe * 原型模式 ) 1.1.1 工廠方法 *義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。FactoryMethod使一個類的實例*延遲到其子類。適用性 1.當一個類不知道它所必須創(chuàng)建的對象的類的時候。 2.當一個類希望由它的子類來指定它所創(chuàng)建的對象的時候。 3.當*將創(chuàng)建對象的職責委托給多個幫助*類中的某一個,并且*希望將哪一個幫助子類是代理者這一信息局部化的時候。參與者 1.Product 定義工廠方法所創(chuàng)建的對象的接口。 2.ConcreteProduct 實現(xiàn)Product接口。 3.Creator 聲明工廠方法,該方法返回一個Product類型的對象* Creator也可以定義一個工廠方法的缺省實現(xiàn),它返回一個缺省的ConcreteProduct對象。 可以調用工廠方法以創(chuàng)建一個Product對象。 4.ConcreteCreator 重定義工廠方法以返回一個ConcreteProduct實例。類圖例子*roduct public interface Work void doWork();ConcreteProduct public class StudentWork implements Work public void doWork() System.out.println(學生*作業(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 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*Work(); IWorkFactory teacherWorkFactory * new TeacherWorkFactory(); teacherWorkFactory.g*tWork().*oWork(); result 學生做作業(yè)!老師審批作業(yè)!1.1.2 抽象工廠 提供一個創(chuàng)建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。適用性 1.一個系統(tǒng)要獨立于它的*品的創(chuàng)建、組合和表示時。 2.一個系統(tǒng)要由多個產品系列中的一個來配置時。 3.當你要強調一系列相關的產品對象的設計以便進行聯(lián)合使用時* 4*當你提供一個產品類庫,而只想顯示它們*接口而不是實現(xiàn)時。參與者 1.Ab*tractFactory 聲明一個創(chuàng)建抽象產品對象的操作接口。 2.ConcreteFactory 實現(xiàn)創(chuàng)建具體產品對象的操作。 *.AbstractProduct 為一類產品對象聲明一個接口。 4.ConcreteProdu*t 定義一個將被相應的具體工廠創(chuàng)建的產品*象。 實現(xiàn)*bstractProduct接口。 5.Client 僅使用由AbstractFactory和AbstractProduc*類聲明的接口類圖例子*bstractFactory public interface IAn*malFactory ICat createCat(); IDog cre*teDog();ConcreteFactory 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 WhiteDog(); 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 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 BlackAnimalFactory(); 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 = whiteAnimalFactory.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 建造者模式 將一個復雜對象的構*與它的表示分離,使*同樣的構建過程可以創(chuàng)建不同的表示。適用性 1.當創(chuàng)建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。 *.當構造過程必須允*被構造的對象有不同*表示時。參與者 1.Builder 為創(chuàng)建一個Product對象的各個部件指定抽象接口。 2.ConcreteBuilder 實現(xiàn)Buil*er的接口以構造和裝配該產品的各個部件。 定義并明確它所創(chuàng)建的表示* 提供一個檢索產品的接口。 3.Director 構造一個使用Builder接口的對象。 4.Product 表示被構造的復雜對象。ConcreteBuilder創(chuàng)建該產品的內部表示并定義它的裝配過程。 包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。類圖例子Buil*er public interface PersonBuilder void buildHead(); v*id buildBody(); void buildFoot()* Person buildPerson();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() retur* 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; public 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 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)模式 保證一個類僅有一個實例,*提供一個訪問它的全局訪*點。適用性 1.當類只能有一個*例而且客戶可以從一個眾所周知的訪問點訪問它時。 2.當這個唯一實例應該是通過子類化可擴展的,并且客戶應該無需更改代碼就能使用一個擴展的實例時。參與者 Singleton 定義一個Instance操作,允許客戶訪問它的唯一實例。Instance是一個類操作。 可能負*創(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 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 原型模式 用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。適用性 1.當一個系統(tǒng)應該獨立于它的產品創(chuàng)*、構成和表示時。 2.當要實例化的類是在運行時刻指定時,例如,通過動態(tài)裝載。 3.為了避免創(chuàng)建一個與產品類層次平行的工廠*層次時。 4.當一個類的實例只能有幾個不同狀態(tài)組合中的一種時。 建立相應數(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 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 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(); result prototypeprototype1.2 結構型模式Adapter * 適配器模式 * Bridge ( 橋接模* ) Composite ( 組合模式 ) Decorator ( 裝*模式 ) Facade ( 外觀模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) 1.2.1 適配器模式 將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口*兼容而不能一起工作的那*類可以一起工作。適用性 1.你想使*一個已經存在的類,而它的接口不符合你的需求。 2.你想創(chuàng)建一個可以復用的類,該類可以與其他不相關的類或不可預見的類(即那*接口 可能不一定兼容的類)協(xié)同工作。 *.(僅適用于對象Adapter)你想使用一些已經存在的子類,但是不可能對每一個都進行 子類化以匹配它們的接口。對象適配器可以適配它的父類接口。參與者 1.Target 定義Client使用的與特定領域相關的接口。 2.Client 與符合Target接口的對象協(xié)同。 3.Adapt*e 定義一個已經存在的接口,這個接口需要適配。 4.Adapter 對Adaptee的接口與Target接口進行適配類圖例子Target public interface Target void adapteeMethod(); 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.adapteeMethod();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)部分分離,使它們都可以獨立地變化。適用性 1.你不希望在抽*和它的實現(xiàn)部分之間有一個固定的綁定關系。 例如這種情況可能是因為,在程序運行時刻實現(xiàn)部分應可以*選擇或者切換。 2.類的抽象以及它的實現(xiàn)都應該可以通*生成子類的方法加以擴充。 這時Bridge模式使你可以對不同的抽象接口和實現(xiàn)部分進行組合,并分別對它們進行擴充。 3.對一個抽象的實現(xiàn)部分的修改應對客戶不產生影響,即客戶的代碼不必重新編譯。 4.正如在意圖一節(jié)的第一個類圖中所示的那樣,有許多類要生成。 這*一種類層次結構說明你必須將一個對象分解成兩個部分。 5.*想在多個對象間共享實現(xiàn)(可能使用引用計數(shù)),但同時要求客戶并不知*這一點。參與者 1.Abstraction 定義抽象類的接口。 維護一個指向Implementor類型對象的指針。 2.RefinedAbstraction 擴充由Abstraction定義的接口。 3.Implementor 定義實現(xiàn)類的接口,該接口不一定要與Ab*traction的接口完全一致。 事實上這兩個接口可以完全不同。 *般來講,Implementor接口僅提供基本操作,而Abstraction則定義了基于這些基本操作的較高層次的操作。 4.ConcreteImplementor *現(xiàn)Implementor接口并定義它的具體實現(xiàn)。類圖例子Abstr*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; public 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() Cloth*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() + 穿馬甲); 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(); Clot*ing trouser = new Trouser(); jacket.personDressCloth(man); trouser.personDressCloth(man); j*cket.personDressCloth(lady); trouser.personDressCloth(lady); result 男人穿馬甲男人穿褲子女人穿馬甲女人穿褲子1.2.3 組合模式 將對象組合成樹形結構以表示部分-整體的層次結構。Composite使得用戶對單個對象和組合對*的使用具有一致性。適用性 1.你想表示對象的部分-整*層次結構。 2.你希望用戶忽略組合對象與單個對象的不同,用戶將統(tǒng)一地使用組合結構中的所有對象。參與者 1.Component 為組合中的對象聲明接口。 在適當?shù)那闆r下,實現(xiàn)所有類共有接口的缺省行為。 聲明一個接口用于訪問和管理Component的子組件。 (可選)在遞歸結構中定義一個接口,用于訪問一個父部件,并在合*的情況下實現(xiàn)它。 2.Leaf 在組合中表示葉節(jié)點對象,葉節(jié)點沒有子節(jié)點。 在組合中定義節(jié)點對象的行為。 3.Compos*te 定義有子部件的*些部件的行為。 存儲子部件。 在Component接口中實現(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 employer*; 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;/程序員, 表示沒有下屬了 public 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;/項目助理, 表示沒有下屬了 public void add(Employer employer) public void delet*(Employer employer) Composite public class Project*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) Employer pm = new ProjectManager(項目經理); Emplo*er pa = new ProjectAssistant(項目助理); Employer progra*mer1 = new Programmer(程序員一); Employer programmer2 = new Programmer(程序員二); pm.add(pa);/為項目經理添加項目助理 pm.add(programmer2);/*項目經理*加程序員 List ems = pm.getEm*loyers(); for (Employer em : ems) System.out.println(em.getNam*(); *result 項目助理程序員二1.2.4 裝飾模式 動態(tài)地給一個對象添加一些額外的職責。就增加功能來說,Decorator模*相比生成子類更為*活。適用性 1.在不影響其他*象的情況下,以動態(tài)、透明的方式給單個對象添加職責。 2.處理那些可以撤消的職責。 3.當不能采用生成子類的方法進行擴充時。參與者 1.Component 定義一個對象接口,可以給這些對象動態(tài)地添加職責。 2.ConcreteComponent 定義一個對象,可以給這個對象添加一些職責。 3.Decorator 維持一個指向Component對象的指針,并定義一個與Component接口一致的接口。 4.ConcreteDecorator 向組件添加職責。類圖例子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) 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 extends Decorator * public void eat() super.eat(); Syst*m.out.println(=); System.out.println(ManDecoratorB類); Test public
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保利地暖合同范例
- 小升初專項知識點課件
- 社區(qū)工作者培訓心得體會模版
- 個體網絡借款合同范例
- 區(qū)塊鏈技術在遠程教育資源共享中的價值
- 公司車輛采購合同范例
- 兒童育嬰服務合同范例
- 書籍設計合同范例
- 個人房屋托管合同范例
- 2024年數(shù)控超精密車床項目資金籌措計劃書代可行性研究報告
- 合同審計底稿
- 畢業(yè)研究生登記表(適用于江蘇省)
- 九宮數(shù)獨200題(附答案全)
- 保護女方的婚前協(xié)議模板范文
- 在線網課知道智慧《信號檢測與估計(哈爾濱工程大學)》單元測試考核答案
- VDA6.3-2023過程審核檢查表
- 7.2理解父母學會感恩(課件)-【中職專用】中職思想政治《心理健康與職業(yè)生涯》(高教版2023基礎模塊)
- 幼兒園安全《身體警報》
- CJJ 82-2012 園林綠化工程施工及驗收規(guī)范
- 數(shù)字貿易學 課件 第2章 數(shù)字貿易的產生與發(fā)展
- 第四章教師的權利與義務課件
評論
0/150
提交評論