Java中23種設(shè)計(jì)模式_第1頁(yè)
Java中23種設(shè)計(jì)模式_第2頁(yè)
Java中23種設(shè)計(jì)模式_第3頁(yè)
Java中23種設(shè)計(jì)模式_第4頁(yè)
Java中23種設(shè)計(jì)模式_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Java中23種設(shè)計(jì)模式目錄1. 設(shè)計(jì)模式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)模式58

2、1.3.9 策略模式611.3.10 模板方法631.3.11 訪問(wèn)者模式651. 設(shè)計(jì)模式(超級(jí)詳細(xì))1.1 創(chuàng)建型模式AbstractFactory ( 抽象工廠 ) FactoryMethod ( 工廠方法 ) Singleton ( 單態(tài)模式 ) Builder ( 建造者模式 ) Protot*pe * 原型模式 ) 1.1.1 工廠方法 *義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。FactoryMethod使一個(gè)類(lèi)的實(shí)例*延遲到其子類(lèi)。 適用性 1.當(dāng)一個(gè)類(lèi)不知道它所必須創(chuàng)建的對(duì)象的類(lèi)的時(shí)候。 2.當(dāng)一個(gè)類(lèi)希望由它的子類(lèi)來(lái)指定它所創(chuàng)建的對(duì)象的時(shí)候。 3.當(dāng)*將創(chuàng)

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

4、t 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è)!"); Creator public interface IWorkFactory Wor

5、k 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) IWor

6、kFactory studentWorkFactory = new StudentWorkFactory(); studentWorkFactory.getWork().d*Work(); IWorkFactory teacherWorkFactory * new TeacherWorkFactory(); teacherWorkFactory.g*tWork().*oWork(); result 學(xué)生做作業(yè)!老師審批作業(yè)!1.1.2 抽象工廠 提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,而無(wú)需指定它們具體的類(lèi)。 適用性 1.一個(gè)系統(tǒng)要獨(dú)立于它的*品的創(chuàng)建、組合和表示時(shí)。 2.一個(gè)系

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

8、明的接口 類(lèi)圖 例子*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*o

9、ry 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(&quo

10、t;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 publi

11、c 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.ea

12、t(); 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

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

14、ilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過(guò)程。 包含定義組成部件的類(lèi),包括將這些部件裝配成最終產(chǎn)品的接口。 類(lèi)圖 例子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* Ma

15、n(); 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(Pers

16、onBuilder 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 bod

17、y; 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.const

18、ructPerson(new ManBuilder(); System*out.println(person.getBody(); System.out.println(person.getFoot(); System.out.println(person.getHead(); result 建造男人*身體建造男*的腳建造男人的頭1.1.4 單態(tài)模式 保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,*提供一個(gè)訪問(wèn)它的全局訪*點(diǎn)。 適用性 1.當(dāng)類(lèi)只能有一個(gè)*例而且客戶(hù)可以從一個(gè)眾所周知的訪問(wèn)點(diǎn)訪問(wèn)它時(shí)。 2.當(dāng)這個(gè)唯一實(shí)例應(yīng)該是通過(guò)子類(lèi)化可擴(kuò)展的,并且客戶(hù)應(yīng)該無(wú)需更改代碼就能使用一個(gè)擴(kuò)展的實(shí)例時(shí)。 

19、;參與者 Singleton 定義一個(gè)Instance操作,允許客戶(hù)訪問(wèn)它的唯一實(shí)例。Instance是一個(gè)類(lèi)操作。 可能負(fù)*創(chuàng)建它自己的唯一實(shí)例。 類(lèi)圖 例子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 stat

20、ic 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í)例指定創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。 適用性 1.當(dāng)一個(gè)系統(tǒng)應(yīng)該獨(dú)立于它的產(chǎn)品創(chuàng)*、構(gòu)成和表示

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

22、te 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 ConcretePrototy

23、pe(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 結(jié)構(gòu)型模式

24、Adapter * 適配器模式 * Bridge ( 橋接模* ) Composite ( 組合模式 ) Decorator ( 裝*模式 ) Facade ( 外觀模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) 1.2.1 適配器模式 將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。Adapter模式使得原本由于接口*兼容而不能一起工作的那*類(lèi)可以一起工作。 適用性 1.你想使*一個(gè)已經(jīng)存在的類(lèi),而它的接口不符合你的需求。 2.你想創(chuàng)建一個(gè)可以復(fù)用的類(lèi),該類(lèi)可以與其他不相關(guān)的類(lèi)或不可預(yù)見(jiàn)的類(lèi)(即那*接口 可能不一定兼容的類(lèi))協(xié)同工作。 *.(僅適用于對(duì)象A

25、dapter)你想使用一些已經(jīng)存在的子類(lèi),但是不可能對(duì)每一個(gè)都進(jìn)行 子類(lèi)化以匹配它們的接口。對(duì)象適配器可以適配它的父類(lèi)接口。 參與者 1.Target 定義Client使用的與特定領(lǐng)域相關(guān)的接口。 2.Client 與符合Target接口的對(duì)象協(xié)同。 3.Adapt*e 定義一個(gè)已經(jīng)存在的接口,這個(gè)接口需要適配。 4.Adapter 對(duì)Adaptee的接口與Target接口進(jìn)行適配 類(lèi)圖 例子Target public interface Target void adapteeMethod(); void adapterMethod();Adaptee publi

26、c 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()

27、 *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 橋接模式 將抽象部分與它*實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。 適用性 1.你不希望在抽*和它的

28、實(shí)現(xiàn)部分之間有一個(gè)固定的綁定關(guān)系。 例如這種情況可能是因?yàn)椋诔绦蜻\(yùn)行時(shí)刻實(shí)現(xiàn)部分應(yīng)可以*選擇或者切換。 2.類(lèi)的抽象以及它的實(shí)現(xiàn)都應(yīng)該可以通*生成子類(lèi)的方法加以擴(kuò)充。 這時(shí)Bridge模式使你可以對(duì)不同的抽象接口和實(shí)現(xiàn)部分進(jìn)行組合,并分別對(duì)它們進(jìn)行擴(kuò)充。 3.對(duì)一個(gè)抽象的實(shí)現(xiàn)部分的修改應(yīng)對(duì)客戶(hù)不產(chǎn)生影響,即客戶(hù)的代碼不必重新編譯。 4.正如在意圖一節(jié)的第一個(gè)類(lèi)圖中所示的那樣,有許多類(lèi)要生成。 這*一種類(lèi)層次結(jié)構(gòu)說(shuō)明你必須將一個(gè)對(duì)象分解成兩個(gè)部分。 5.*想在多個(gè)對(duì)象間共享實(shí)現(xiàn)(可能使用引用計(jì)數(shù)),但同時(shí)要求客戶(hù)并不知*這一點(diǎn)。 參與者 1.Abstraction 定義抽象類(lèi)的接口。

29、 維護(hù)一個(gè)指向Implementor類(lèi)型對(duì)象的指針。 2.RefinedAbstraction 擴(kuò)充由Abstraction定義的接口。 3.Implementor 定義實(shí)現(xiàn)類(lèi)的接口,該接口不一定要與Ab*traction的接口完全一致。 事實(shí)上這兩個(gè)接口可以完全不同。 *般來(lái)講,Implementor接口僅提供基本操作,而Abstraction則定義了基于這些基本操作的較高層次的操作。 4.ConcreteImplementor *現(xiàn)Implementor接口并定義它的具體實(shí)現(xiàn)。 類(lèi)圖 例子Abstr*ction public abstract class Person

30、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();RefinedAbs

31、traction 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*othi

32、ng.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

33、 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

34、.personDressCloth(man); trouser.personDressCloth(man); j*cket.personDressCloth(lady); trouser.personDressCloth(lady); result 男人穿馬甲男人穿褲子女人穿馬甲女人穿褲子1.2.3 組合模式 將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示"部分-整體"的層次結(jié)構(gòu)。"Composite使得用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)*的使用具有一致性。" 適用性 1.你想表示對(duì)象的部分-整*層次結(jié)構(gòu)。 2.你希望用戶(hù)忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶(hù)將統(tǒng)一地使用組合結(jié)構(gòu)

35、中的所有對(duì)象。 參與者 1.Component 為組合中的對(duì)象聲明接口。 在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類(lèi)共有接口的缺省行為。 聲明一個(gè)接口用于訪問(wèn)和管理Component的子組件。 (可選)在遞歸結(jié)構(gòu)中定義一個(gè)接口,用于訪問(wèn)一個(gè)父部件,并在合*的情況下實(shí)現(xiàn)它。 2.Leaf 在組合中表示葉節(jié)點(diǎn)對(duì)象,葉節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)。 在組合中定義節(jié)點(diǎn)對(duì)象的行為。 3.Compos*te 定義有子部件的*些部件的行為。 存儲(chǔ)子部件。 在Component接口中實(shí)現(xiàn)與子部件有*的操作。 4.Client 通過(guò)Component接*操縱組合部件的對(duì)象。 類(lèi)圖 例子Component p*b

36、lic 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

37、(name); *ublic List getE*ployers() return this.employers; Leaf public class Programmer extends Employer public Programmer(String name) setNam*(name); employers = null;/程序員, 表示沒(méi)有下屬了 public v*id add(Employer employer) public void delete(Employer employer) public class Pro*ectAssistant extends Employer

38、 public ProjectAss*stant(String name) setName(name); employers = *ull;/項(xiàng)目助理, 表示沒(méi)有下屬了 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 v

39、oid 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("項(xiàng)目經(jīng)理"); Emplo*er pa = new ProjectAssistant("項(xiàng)目助理"); Employer progr

40、a*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(em.getNam*(); *result 項(xiàng)目助理程序員二1.2.4 裝飾模式 動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來(lái)說(shuō),Deco

41、rator模*相比生成子類(lèi)更為*活。 適用性 1.在不影響其他*象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)。 2.處理那些可以撤消的職責(zé)。 3.當(dāng)不能采用生成子類(lèi)的方法進(jìn)行擴(kuò)充時(shí)。 參與者 1.Component 定義一個(gè)對(duì)象接口,可以給這些對(duì)象動(dòng)態(tài)地添加職責(zé)。 2.ConcreteComponent 定義一個(gè)對(duì)象,可以給這個(gè)對(duì)象添加一些職責(zé)。 3.Decorator 維持一個(gè)指向Component對(duì)象的指針,并定義一個(gè)與Component接口一致的接口。 4.ConcreteDecorator 向組件添加職責(zé)。 類(lèi)圖 例子Component pu

42、blic 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 ea

43、t() person.eat(); ConcreteDec*rator publi* class ManDecoratorA extends Decorator public void eat() super.eat(); reEat(); Sy*tem.out.println("ManDecoratorA類(lèi)"); public void reEat() System.out.println("再吃一頓飯"); *public class ManDecoratorB extends Decorator * public void eat() super.

44、eat(); Syst*m.out.println("="); System.out.println("ManDecoratorB類(lèi)"); 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

45、(); result 男人在吃再吃一頓飯ManDecoratorA類(lèi)=ManDecoratorB類(lèi)1.2.5 外觀模式 為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,F(xiàn)acade模式定義了一個(gè)高層接口,這個(gè)接口使得這*子系統(tǒng)更加容易使用。 適用性 1.當(dāng)你要為一個(gè)*雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口時(shí)。子系統(tǒng)往往因?yàn)椴粩嘌莼兊迷絹?lái)越 復(fù)雜。大多數(shù)模式使用時(shí)都會(huì)產(chǎn)生更多更小的類(lèi)。這使得子系統(tǒng)更具可重用性,也更容 易對(duì)子系統(tǒng)進(jìn)行定制,但這也給*些不需要定制子系統(tǒng)的用戶(hù)帶來(lái)一些使用上的困難。 Fa*ade可以提供一個(gè)簡(jiǎn)單的缺省視圖,這一視圖對(duì)大多數(shù)用戶(hù)來(lái)說(shuō)已經(jīng)足*,而那些需 要更多的可定制性的用戶(hù)可以越過(guò)facade層。 2.客戶(hù)程序與抽象類(lèi)的實(shí)現(xiàn)部分之間存在著很大的依賴(lài)性。引入facade將這個(gè)子系統(tǒng)與客 戶(hù)以及其他的子系統(tǒng)分離,可以提高子系統(tǒng)的獨(dú)立性和可移植性。 3.當(dāng)你需要構(gòu)建一個(gè)層次結(jié)構(gòu)的子系統(tǒng)時(shí),使用facade模式定義子系統(tǒng)中每層的入口點(diǎn)。 如果子系統(tǒng)之間是相互依賴(lài)的,你可以讓它們僅通過(guò)facade進(jìn)行通訊,從而簡(jiǎn)化了它們 之間的依賴(lài)關(guān)系。 參與者 1.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論