結(jié)構(gòu)型設(shè)計(jì)模式_第1頁
結(jié)構(gòu)型設(shè)計(jì)模式_第2頁
結(jié)構(gòu)型設(shè)計(jì)模式_第3頁
結(jié)構(gòu)型設(shè)計(jì)模式_第4頁
結(jié)構(gòu)型設(shè)計(jì)模式_第5頁
已閱讀5頁,還剩91頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、設(shè)計(jì)模式-DecoratorDecorator模式模式-GOF裝飾模式(別名:包裝器)裝飾模式(別名:包裝器) 動態(tài)地給對象添加一些額外的職責(zé)。就功能來說裝飾動態(tài)地給對象添加一些額外的職責(zé)。就功能來說裝飾模式相比生成子類更為靈活。模式相比生成子類更為靈活。Decorator Pattern(Another Name: Wrapper) Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending

2、 functionality.Decorator概述概述l裝飾模式是裝飾模式是動態(tài)地擴(kuò)展一個對象動態(tài)地擴(kuò)展一個對象的功能,而的功能,而不需要改變原始類代碼不需要改變原始類代碼的一種成熟模式。在的一種成熟模式。在裝飾模式中,裝飾模式中,“具體組件具體組件”類和類和“具體裝飾具體裝飾”類是該模式中的最重要的兩個角色。類是該模式中的最重要的兩個角色。 Decorator案例案例l指揮部希望按時得到水文站測量到的關(guān)于水指揮部希望按時得到水文站測量到的關(guān)于水流的信息,比如流量、流速等。流的信息,比如流量、流速等。l假設(shè)系統(tǒng)中有一個假設(shè)系統(tǒng)中有一個BirdBird抽象類以及抽象類以及BirdBird類的類

3、的一個子類:一個子類:SparrowSparrow。lSparrowSparrow類實(shí)現(xiàn)了類實(shí)現(xiàn)了BirdBird類的類的flyfly方法,使得方法,使得SparrowSparrow類創(chuàng)建的對象調(diào)用類創(chuàng)建的對象調(diào)用flyfly方法能連續(xù)飛方法能連續(xù)飛行行100100米。米。l現(xiàn)在用戶需要兩種鳥,必須分別能連續(xù)飛行現(xiàn)在用戶需要兩種鳥,必須分別能連續(xù)飛行150150米和米和200200米。米。Decorator的結(jié)構(gòu)與的結(jié)構(gòu)與 使用使用l裝飾模式的結(jié)構(gòu)中包括四種角色裝飾模式的結(jié)構(gòu)中包括四種角色l 抽象組件(抽象組件(ComponentComponent) l 具體組件(具體組件(ConcreteC

4、omponentConcreteComponent) l 裝飾(裝飾(DecoratorDecorator) l 具體裝飾(具體裝飾(ConcreteDecotatorConcreteDecotator) Decorator UML類圖類圖Decorator結(jié)構(gòu)的描述與使用結(jié)構(gòu)的描述與使用l1抽象組件抽象組件 : Bird.java public abstract class Bird public abstract int fly();Decorator結(jié)構(gòu)的描述與使用結(jié)構(gòu)的描述與使用l2具體組件具體組件 : Sparrow.java public class Sparrow extends

5、 Bird public final int DISTANCE=100; public int fly() return DISTANCE; Decorator結(jié)構(gòu)的描述與使用結(jié)構(gòu)的描述與使用l3. 裝飾裝飾 (Decorator): Decorator.java public abstract class Decorator extends Bird protected Bird bird; public Decorator() public Decorator(Bird bird) this.bird=bird; Decorator結(jié)構(gòu)的描述與使用結(jié)構(gòu)的描述與使用l4具體裝飾(具體裝飾(C

6、oncreteDecotator): SparrowDecorator.java public class SparrowDecorator extends Decorator /eleFly方法能飛方法能飛50米米 public final int DISTANCE=50; SparrowDecorator(Bird bird) super(bird); public int fly() int distance=0; distance=bird.fly()+eleFly(); return distance; private int eleFly() /裝飾者新添加的方法裝飾者新添加的方法

7、 return DISTANCE; Decorator結(jié)構(gòu)的描述與使用結(jié)構(gòu)的描述與使用l5. 應(yīng)用應(yīng)用 Application.java public class Application public void needBird(Bird bird) int flyDistance=bird.fly(); System.out.println(這只鳥能飛行這只鳥能飛行+flyDistance +米米); public static void main(String args) Application client=new Application (); Bird sparrow=new Spa

8、rrow(); Bird sparrowDecorator1= new SparrowDecorator(sparrow); Bird sparrowDecorator2= new SparrowDecorator(sparrowDecorator1); client.needBird(sparrowDecorator1); client.needBird(sparrowDecorator2); Decorator優(yōu)點(diǎn)優(yōu)點(diǎn)l被裝飾者和裝飾者是松耦合關(guān)系。被裝飾者和裝飾者是松耦合關(guān)系。l由于裝飾(由于裝飾(Decorator)僅僅依賴于抽象組件)僅僅依賴于抽象組件(Component),因此具體

9、裝飾只知道它要),因此具體裝飾只知道它要裝飾的對象是抽象組件的某一個子類的實(shí)例裝飾的對象是抽象組件的某一個子類的實(shí)例,但不需要知道是哪一個具體子類。,但不需要知道是哪一個具體子類。l裝飾模式滿足裝飾模式滿足“開開-閉原則閉原則”。不必修改具。不必修改具體組件,就可以增加新的針對該具體組件體組件,就可以增加新的針對該具體組件的具體裝飾的具體裝飾l可以使用多個具體裝飾來裝飾具體組件的可以使用多個具體裝飾來裝飾具體組件的實(shí)例。實(shí)例。設(shè)計(jì)模式-AdapterAdapter-GOF適配器模式(別名:包裝器)適配器模式(別名:包裝器) 將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接將一個類的接口轉(zhuǎn)換成客戶希望的

10、另外一個接口。口。Adapter模式使得原本由于接口不兼容而不模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。能一起工作的那些類可以一起工作。Adapter Pattern(Another Name: Wrapper) Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldnt otherwise because of incompatible interfaces. Adapter概述概述l 適配器模

11、式是將一個類的接口(適配器模式是將一個類的接口(被適配者被適配者)轉(zhuǎn)換成客戶希望的另外一個接口(轉(zhuǎn)換成客戶希望的另外一個接口(目標(biāo)目標(biāo))的)的成熟模式。成熟模式。l該模式中涉及有目標(biāo)、被適配者和適配器。該模式中涉及有目標(biāo)、被適配者和適配器。適配器模式的關(guān)鍵是建立一個適配器,這個適配器模式的關(guān)鍵是建立一個適配器,這個適配器實(shí)現(xiàn)了目標(biāo)接口并包含有被適配者的適配器實(shí)現(xiàn)了目標(biāo)接口并包含有被適配者的引用。引用。 Adapter案例案例l 用戶已有一個兩相的插座,但最近用戶又有用戶已有一個兩相的插座,但最近用戶又有了一個新的三相插座。用戶現(xiàn)在已經(jīng)有一臺了一個新的三相插座。用戶現(xiàn)在已經(jīng)有一臺洗衣機(jī)和一臺電視

12、機(jī),洗衣機(jī)按著三相插座洗衣機(jī)和一臺電視機(jī),洗衣機(jī)按著三相插座的標(biāo)準(zhǔn)配有三相插頭,而電視機(jī)按著兩相插的標(biāo)準(zhǔn)配有三相插頭,而電視機(jī)按著兩相插座的標(biāo)準(zhǔn)配有座的標(biāo)準(zhǔn)配有兩相插頭兩相插頭(被適配者)(被適配者)?,F(xiàn)在?,F(xiàn)在用戶想用新的用戶想用新的三相插座三相插座(目標(biāo))來使用洗衣(目標(biāo))來使用洗衣機(jī)和電視機(jī)。機(jī)和電視機(jī)。Adapter的結(jié)構(gòu)與使用的結(jié)構(gòu)與使用 l結(jié)構(gòu)中包括三種結(jié)構(gòu)中包括三種角色角色l目標(biāo)目標(biāo)(TargetTarget) l被被適配者(適配者(AdapteeAdaptee) l適配器適配器(AdapterAdapter) Adapter UMLUML類圖類圖Adapter的描述與使用的描述

13、與使用 l1目標(biāo)(目標(biāo)(Target) : ThreeElectricOutlet.java public interface ThreeElectricOutlet public abstract void connectElectricCurrent(); Adapter的描述與使用的描述與使用 l2.被適配者(被適配者(Adaptee):TwoElectricOutlet.javapublic interface TwoElectricOutlet public abstract void connectElectricCurrent(); Adapter的描述與使用的描述與使用 l3適

14、配器(適配器(Adapter) ThreeElectricAdapter.java public class ThreeElectricAdapter implements ThreeElectricOutlet TwoElectricOutlet outlet; ThreeElectricAdapter(TwoElectricOutlet outlet) this.outlet=outlet; public void connectElectricCurrent() outlet.connectElectricCurrent(); Adapter的描述與使用的描述與使用 l4. 應(yīng)用應(yīng)用 A

15、pplication.java class TV implements TwoElectricOutlet String name; TV() name=長江電視機(jī)長江電視機(jī); TV(String s) name=s; public void connectElectricCurrent() turnOn(); public void turnOn() System.out.println(name+開始播放節(jié)目。開始播放節(jié)目。); Adapter的描述與使用的描述與使用 l4. 應(yīng)用應(yīng)用 Application.java class Wash implements ThreeElectric

16、Outlet String name; Wash() name=黃河洗衣機(jī)黃河洗衣機(jī); Wash(String s) name=s; public void connectElectricCurrent() turnOn(); public void turnOn() System.out.println(name+開始洗衣物。開始洗衣物。); Adapter的描述與使用的描述與使用 l4. 應(yīng)用應(yīng)用 Application.java public class Application public static void main(String args) ThreeElectricOutle

17、t outlet; Wash wash=new Wash(); outlet=wash; System.out.println(使用三相插座接通電流:使用三相插座接通電流:); outlet.connectElectricCurrent(); TV tv=new TV(); ThreeElectricAdapter adapter=new ThreeElectricAdapter(tv); outlet=adapter; System.out.println(使用三相插座接通電流:使用三相插座接通電流:); outlet.connectElectricCurrent(); Adapter優(yōu)點(diǎn)優(yōu)

18、點(diǎn)l 目標(biāo)(目標(biāo)(Target)和被適配者()和被適配者(Adaptee)是)是完全解耦的關(guān)系。完全解耦的關(guān)系。l適配器模式滿足適配器模式滿足“開開-閉原則閉原則”。當(dāng)添加一個。當(dāng)添加一個實(shí)現(xiàn)實(shí)現(xiàn)Adaptee接口的新類時,不必修改接口的新類時,不必修改Adapter,Adapter就能對這個新類的實(shí)例進(jìn)就能對這個新類的實(shí)例進(jìn)行適配。行適配。設(shè)計(jì)模式- FacadeFaade-GOF外觀模式外觀模式為系統(tǒng)中的一組接口提供一個一致的界面,為系統(tǒng)中的一組接口提供一個一致的界面,F(xiàn)aade模式模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。

19、易使用。Faade Pattern Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.Faade概述概述l 外觀模式是外觀模式是簡化用戶和子系統(tǒng)進(jìn)行交互簡化用戶和子系統(tǒng)進(jìn)行交互的成的成熟模式,外觀模式的關(guān)鍵是為子系統(tǒng)提供一熟模式,外觀模式的關(guān)鍵是為子系統(tǒng)提供一個稱作個稱作外觀外觀的類,該外觀類的實(shí)例負(fù)責(zé)和子的類,該外觀類的實(shí)例負(fù)責(zé)和子系統(tǒng)中類的實(shí)例打交道。

20、當(dāng)用戶想要和子系系統(tǒng)中類的實(shí)例打交道。當(dāng)用戶想要和子系統(tǒng)中的若干個類的實(shí)例打交道時,可以代替統(tǒng)中的若干個類的實(shí)例打交道時,可以代替地和子系統(tǒng)的外觀類的實(shí)例打交道。地和子系統(tǒng)的外觀類的實(shí)例打交道。 Faade案例案例l 郵政系統(tǒng)負(fù)責(zé)郵寄包裹的子系統(tǒng)包含郵政系統(tǒng)負(fù)責(zé)郵寄包裹的子系統(tǒng)包含Check、Weight和和Transport類。類。lCheck類的實(shí)例負(fù)責(zé)對包裹進(jìn)行安全檢查類的實(shí)例負(fù)責(zé)對包裹進(jìn)行安全檢查lWeight類的實(shí)例負(fù)責(zé)根據(jù)包裹的重量計(jì)算郵資類的實(shí)例負(fù)責(zé)根據(jù)包裹的重量計(jì)算郵資lTransport類的實(shí)例負(fù)責(zé)為包裹選擇運(yùn)輸工具。類的實(shí)例負(fù)責(zé)為包裹選擇運(yùn)輸工具。l因此,一個要郵寄的包裹的

21、用戶如果直接和因此,一個要郵寄的包裹的用戶如果直接和負(fù)責(zé)郵寄包裹的子系統(tǒng)的類打交道就會非常負(fù)責(zé)郵寄包裹的子系統(tǒng)的類打交道就會非常不方便。不方便。 Faade結(jié)構(gòu)與使用結(jié)構(gòu)與使用l 模式的結(jié)構(gòu)中包括兩種角色模式的結(jié)構(gòu)中包括兩種角色l子系統(tǒng)(子系統(tǒng)(SubsystemSubsystem) l外觀(外觀(FacadeFacade) Faade UML圖圖Faade案例案例l 報社的廣告系統(tǒng)有三個類報社的廣告系統(tǒng)有三個類CheckWord、Charge和和TypeSetting類,各個類的職責(zé)如類,各個類的職責(zé)如下:下:lCheckWord類負(fù)責(zé)檢查廣告內(nèi)容含有的字符數(shù)類負(fù)責(zé)檢查廣告內(nèi)容含有的字符數(shù)量

22、;量;lCharge類的實(shí)例負(fù)責(zé)計(jì)算費(fèi)用;類的實(shí)例負(fù)責(zé)計(jì)算費(fèi)用;lTypeSetting的實(shí)例負(fù)責(zé)對廣告進(jìn)行排版。的實(shí)例負(fù)責(zé)對廣告進(jìn)行排版。l使用外觀模式簡化用戶和上述子系統(tǒng)所進(jìn)行使用外觀模式簡化用戶和上述子系統(tǒng)所進(jìn)行的交互。的交互。Faade描述與使用描述與使用l 1子系統(tǒng)(子系統(tǒng)(Subsystem) : CheckWord.java public class CheckWord public final int basicAmount=85; String advertisement; int amount; public CheckWord(String advertisement)

23、this.advertisement=advertisement; public void setChargeAmount() amount=advertisement.length()+basicAmount; /計(jì)算出計(jì)費(fèi)字符數(shù)目計(jì)算出計(jì)費(fèi)字符數(shù)目 public int getAmount() return amount; Faade描述與使用描述與使用l1. 子系統(tǒng)(子系統(tǒng)(Subsystem) : Charge.javapublic class Charge public final int basicCharge=12; CheckWord checkWord; Charge(Che

24、ckWord checkWord) this.checkWord=checkWord; public void giveCharge() int charge=checkWord.getAmount()*basicCharge; System.out.println(廣告費(fèi)用廣告費(fèi)用:+charge+元元); Faade描述與使用描述與使用l1. 子系統(tǒng)(子系統(tǒng)(Subsystem):TypeSeting.javapublic class TypeSeting String advertisement; public TypeSeting(String advertisement) this.

25、advertisement=advertisement; public void typeSeting() System.out.println(廣告排版格式廣告排版格式:); System.out.println(*); System.out.println(advertisement); System.out.println(*); Faade描述與使用描述與使用l2. 外觀(外觀(Facade): ClientServerFacade.java public class ClientServerFacade private CheckWord checkWord; private Cha

26、rge charge; private TypeSeting typeSeting; String advertisement; public ClientServerFacade(String advertisement) this.advertisement=advertisement; checkWord=new CheckWord(advertisement); charge=new Charge(checkWord); typeSeting=new TypeSeting(advertisement); public void doAdvertisement() checkWord.s

27、etChargeAmount(); charge.giveCharge(); typeSeting.typeSeting(); Faade描述與使用描述與使用l3應(yīng)用應(yīng)用 Application.java public class Application public static void main(String args) ClientServerFacade clientFacade; String clientAdvertisement=鹿花牌洗衣機(jī),價格鹿花牌洗衣機(jī),價格2356元,聯(lián)系電話:元,聯(lián)系電話:1234567; clientFacade=new ClientServerF

28、acade(clientAdvertisement); clientFacade.doAdvertisement(); Faade優(yōu)點(diǎn)優(yōu)點(diǎn)l 使客戶和子系統(tǒng)中的類無耦合。使客戶和子系統(tǒng)中的類無耦合。l 外觀只是提供了一個更加簡潔的界面,并不外觀只是提供了一個更加簡潔的界面,并不影響用戶直接使用子系統(tǒng)中的類。影響用戶直接使用子系統(tǒng)中的類。l子系統(tǒng)中任何類對其方法的內(nèi)容進(jìn)行修改,子系統(tǒng)中任何類對其方法的內(nèi)容進(jìn)行修改,不影響外觀的代碼。不影響外觀的代碼。CompositeComposite模式 - GOF組合模式組合模式 將對象組合成樹形結(jié)構(gòu)以表示將對象組合成樹形結(jié)構(gòu)以表示“部分部分-整體整體”的層

29、次結(jié)的層次結(jié)構(gòu)。構(gòu)。Composite使得用戶對單個對象和組合對象的使用具使得用戶對單個對象和組合對象的使用具有一致性。有一致性。Composite Pattern Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. Composite概述l組合模式是關(guān)于組合模式是關(guān)于怎樣將對象形成樹形結(jié)構(gòu)怎樣將對象形成樹形結(jié)構(gòu)來表現(xiàn)整體和部分

30、的層次結(jié)構(gòu)的來表現(xiàn)整體和部分的層次結(jié)構(gòu)的成熟模式成熟模式。使用組合模式,可以讓用戶以一致的方。使用組合模式,可以讓用戶以一致的方式處理個體對象和組合對象式處理個體對象和組合對象l組合模式的關(guān)鍵在于無論是個體對象還是組合模式的關(guān)鍵在于無論是個體對象還是組合對象都實(shí)現(xiàn)了相同的接口或都是同一組合對象都實(shí)現(xiàn)了相同的接口或都是同一個抽象類的子類。個抽象類的子類。Composite結(jié)構(gòu)與使用l模式的結(jié)構(gòu)中包括三種角色模式的結(jié)構(gòu)中包括三種角色l抽象組件(抽象組件(Component) lComposite節(jié)點(diǎn)(節(jié)點(diǎn)(Composite Node) l Leaf節(jié)點(diǎn)(節(jié)點(diǎn)(Leaf Node)Composit

31、e UML圖Composite描述與使用l1抽象組件(抽象組件(Component) : MilitaryPerson.java import java.util.*;public interface MilitaryPerson public void add(MilitaryPerson person) ; public void remove(MilitaryPerson person) ; public MilitaryPerson getChild(int index); public Iterator getAllChildren() ; public boolean isLeaf

32、(); public double getSalary(); public void setSalary(double salary); Composite描述與使用l2 Composite節(jié)點(diǎn)(節(jié)點(diǎn)(Composite Node) : MilitaryOfficer.javaimport java.util.*;public class MilitaryOfficer implements MilitaryPerson LinkedList list; String name; double salary; MilitaryOfficer(String name,double salary)

33、 =name; this.salary=salary; list=new LinkedList(); public void add(MilitaryPerson person) list.add(person); public void remove(MilitaryPerson person) list.remove(person); public MilitaryPerson getChild(int index) return list.get(index); public Iterator getAllChildren() return list.iterator(

34、); public boolean isLeaf() return false; public double getSalary() return salary; public void setSalary(double salary) this.salary=salary; Composite描述與使用l3Leaf節(jié)點(diǎn)(節(jié)點(diǎn)(Leaf Node):):MilitarySoldier.javaimport java.util.*;public class MilitarySoldier implements MilitaryPerson double salary; String name;

35、MilitarySoldier(String name,double salary) =name; this.salary=salary; public void add(MilitaryPerson person) public void remove (MilitaryPerson person) public MilitaryPerson getChild(int index) return null; public Iterator getAllChildren() return null; public boolean isLeaf() return true; p

36、ublic double getSalary() return salary; public void setSalary(double salary) this.salary=salary; Composite描述與使用l4應(yīng)用應(yīng)用_1:ComputerSalary.javaimport java.util.*;public class ComputerSalary public static double computerSalary(MilitaryPerson person) double sum=0; if(person.isLeaf()=true) sum=sum+person.g

37、etSalary(); if(person.isLeaf()=false) sum=sum+person.getSalary(); Iterator iterator=person.getAllChildren(); while(iterator.hasNext() MilitaryPerson p= iterator.next(); sum=sum+computerSalary(p); return sum; Composite描述與使用l 4應(yīng)用應(yīng)用_2: Application.java public class Application public static void main(S

38、tring args) MilitaryPerson 連長連長=new MilitaryOfficer(連長連長,5000); MilitaryPerson 排長排長1=new MilitaryOfficer(一排長一排長,4000); MilitaryPerson 排長排長2=new MilitaryOfficer(二排長二排長,4000); MilitaryPerson 班長班長11=new MilitaryOfficer(一班長一班長,2000); MilitaryPerson 班長班長12=new MilitaryOfficer(二班長二班長,2000); MilitaryPerson

39、 班長班長13=new MilitaryOfficer(三班長三班長,2000); MilitaryPerson 班長班長21=new MilitaryOfficer(一班長一班長,2000); MilitaryPerson 班長班長22=new MilitaryOfficer(二班長二班長,2000); MilitaryPerson 班長班長23=new MilitaryOfficer(三班長三班長,2000); MilitaryPerson 班長班長31=new MilitaryOfficer(一班長一班長,2000); MilitaryPerson 班長班長32=new Military

40、Officer(二班長二班長,2000); MilitaryPerson 班長班長33=new MilitaryOfficer(三班長三班長,2000); MilitaryPerson 士兵士兵=new MilitarySoldier60; for(int i=0;i士兵士兵.length;i+) 士兵士兵i=new MilitarySoldier(小兵小兵,1000); 連長連長.add(排長排長1); 連長連長.add(排長排長2); 排長排長1.add(班長班長11); 排長排長1.add(班長班長12); 排長排長1.add(班長班長13); 排長排長2.add(班長班長21); 排長

41、排長2.add(班長班長22); 排長排長2.add(班長班長23); for(int i=0;i=9;i+) 班長班長11.add(士兵士兵i); 班長班長12.add(士兵士兵i+10); 班長班長13.add(士兵士兵i+20); 班長班長21.add(士兵士兵i+30); 班長班長22.add(士兵士兵i+40); 班長班長23.add(士兵士兵i+50); 班長班長31.add(士兵士兵i+60); 班長班長32.add(士兵士兵i+70); 班長班長33.add(士兵士兵i+80); System.out.println(一排的軍餉一排的軍餉:+ComputerSputerSala

42、ry(排長排長1); System.out.println(一班的軍餉一班的軍餉:+ComputerSputerSalary(班長班長11); System.out.println(全連的軍餉全連的軍餉:+ComputerSputerSalary(連長連長); Composite優(yōu)點(diǎn)l組合模式中包含有組合模式中包含有個體對象和組合對象個體對象和組合對象,并形,并形成樹形結(jié)構(gòu),使用戶可以方便地處理個體對象成樹形結(jié)構(gòu),使用戶可以方便地處理個體對象和組合對象。和組合對象。l組合對象和個體對象實(shí)現(xiàn)了相同的接口,用戶組合對象和個體對象實(shí)現(xiàn)了相同的接口,用戶一般不需區(qū)分個體對象和組合對象。一般不需區(qū)分個體

43、對象和組合對象。l當(dāng)增加新的當(dāng)增加新的Composite節(jié)點(diǎn)和節(jié)點(diǎn)和Leaf節(jié)點(diǎn)時,用節(jié)點(diǎn)時,用戶的重要代碼不需要作出修改。戶的重要代碼不需要作出修改。Bridge-GOF橋接模式(別名:柄體模式)橋接模式(別名:柄體模式) 將抽象部分與它的實(shí)現(xiàn)部分分離,使得它們都可以獨(dú)將抽象部分與它的實(shí)現(xiàn)部分分離,使得它們都可以獨(dú)立地變化。立地變化。Bridge Pattern(Another Name: Handle-Body) Decouple an abstraction from its implementation so that the two can vary independently. B

44、ridge概述概述 l 橋接模式是關(guān)于橋接模式是關(guān)于怎樣將抽象部分與它的怎樣將抽象部分與它的實(shí)現(xiàn)部分分離實(shí)現(xiàn)部分分離,使得它們都可以獨(dú)立地變,使得它們都可以獨(dú)立地變化的成熟模式?;某墒炷J?。 Bridge結(jié)構(gòu)與使用l模式的結(jié)構(gòu)中包括四種角色:模式的結(jié)構(gòu)中包括四種角色:l抽象(抽象(Abstraction) l實(shí)現(xiàn)者(實(shí)現(xiàn)者(Implementor) l細(xì)化抽象(細(xì)化抽象(Refined Abstraction) l具體實(shí)現(xiàn)者(具體實(shí)現(xiàn)者(Concrete Implementor) Bridge UML圖Bridge的描述與使用l 1抽象(抽象(Abstraction): Architectu

45、reCost.java public abstract class ArchitectureCost BuildingDesign design; double unitPrice; public abstract double giveCost() ; Bridge的描述與使用l 2實(shí)現(xiàn)者(實(shí)現(xiàn)者(Implementor) : BuildingDesign.javapublic interface BuildingDesign public double computerArea(); Bridge的描述與使用l 3細(xì)化抽象(細(xì)化抽象(Refined Abstraction):):Build

46、ingCost.javapublic class BuildingCost extends ArchitectureCost BuildingCost(BuildingDesign design,double unitPrice) this.design=design; this.unitPrice=unitPrice; public double giveCost() double area=puterArea(); return area*unitPrice; Bridge的描述與使用l 4具體實(shí)現(xiàn)者(具體實(shí)現(xiàn)者(Concrete Implementor):):HouseDesign.ja

47、vapublic class HouseDesign implements BuildingDesign double width,length; int floorNumber; HouseDesign(double width,double length,int floorNumber) this.width=width; this.length=length; this.floorNumber=floorNumber; public double computerArea() return width*length*floorNumber; Bridge的描述與使用l 5應(yīng)用應(yīng)用 App

48、lication.java public class Application public static void main(String args) double width=63,height=30; int floorNumber=8; double unitPrice=6867.38; BuildingDesign design=new HouseDesign(width,height,floorNumber); System.out.println(寬寬+width+米,高米,高+height+米,層數(shù)為米,層數(shù)為+floorNumber); ArchitectureCost cos

49、t=new BuildingCost(design,unitPrice); double price=cost.giveCost(); System.out.printf(每平米造價:每平米造價:+unitPrice+元的商業(yè)樓的建設(shè)成本:元的商業(yè)樓的建設(shè)成本:%.2f元元n,price); width=52; height=28; floorNumber=6; unitPrice=2687.88; design=new HouseDesign(width,height,floorNumber); System.out.println(寬寬+width+米,高米,高+height+米,層數(shù)為米

50、,層數(shù)為+floorNumber); cost=new BuildingCost(design,unitPrice); price=cost.giveCost(); System.out.printf(每平米造價:每平米造價:+unitPrice+元的住宅樓的建設(shè)成本:元的住宅樓的建設(shè)成本:%.2f元元n,price); Bridge優(yōu)點(diǎn)l 橋接模式分離實(shí)現(xiàn)與抽象,使得抽象和實(shí)現(xiàn)可以獨(dú)立的橋接模式分離實(shí)現(xiàn)與抽象,使得抽象和實(shí)現(xiàn)可以獨(dú)立的擴(kuò)展。當(dāng)修改實(shí)現(xiàn)的代碼時,不影響抽象的代碼,反之?dāng)U展。當(dāng)修改實(shí)現(xiàn)的代碼時,不影響抽象的代碼,反之也一樣。比如,對于也一樣。比如,對于19.2.2中的例子,如果具

51、體實(shí)現(xiàn)者中的例子,如果具體實(shí)現(xiàn)者HouseDesign類決定將面積的計(jì)算加上一個額外的值,類決定將面積的計(jì)算加上一個額外的值,即修改了即修改了computerArea()方法,那么并不影響到細(xì)化方法,那么并不影響到細(xì)化抽象者的代碼,反之,如果抽象者決定增加一個參與計(jì)抽象者的代碼,反之,如果抽象者決定增加一個參與計(jì)算的參數(shù):算的參數(shù):adjust,即細(xì)化抽象者修改代碼,在計(jì)算成,即細(xì)化抽象者修改代碼,在計(jì)算成本時通過設(shè)置該參數(shù)的值來計(jì)算成本,那么并不影響實(shí)本時通過設(shè)置該參數(shù)的值來計(jì)算成本,那么并不影響實(shí)現(xiàn)著者的代碼?,F(xiàn)著者的代碼。l滿足開閉滿足開閉-原則。抽象和實(shí)現(xiàn)者處于同層次,使得系統(tǒng)原則。抽

52、象和實(shí)現(xiàn)者處于同層次,使得系統(tǒng)可獨(dú)立地擴(kuò)展這兩個層次。增加新的具體實(shí)現(xiàn)者,不需可獨(dú)立地擴(kuò)展這兩個層次。增加新的具體實(shí)現(xiàn)者,不需要修改細(xì)化抽象,反之增加新的細(xì)化抽象也不需要修改要修改細(xì)化抽象,反之增加新的細(xì)化抽象也不需要修改具體實(shí)現(xiàn)。具體實(shí)現(xiàn)。Bridge概述概述l 一個對象的狀態(tài)依賴于它的成員變量的取值情一個對象的狀態(tài)依賴于它的成員變量的取值情況。對象在不同的運(yùn)行環(huán)境或運(yùn)行時刻,可能況。對象在不同的運(yùn)行環(huán)境或運(yùn)行時刻,可能具有不同的狀態(tài)。在許多情況下,對象調(diào)用方具有不同的狀態(tài)。在許多情況下,對象調(diào)用方法所產(chǎn)生的行為效果依賴于它當(dāng)時的狀態(tài)。法所產(chǎn)生的行為效果依賴于它當(dāng)時的狀態(tài)。 l狀態(tài)模式的關(guān)鍵

53、是將狀態(tài)模式的關(guān)鍵是將對象的狀態(tài)封裝成為獨(dú)立對象的狀態(tài)封裝成為獨(dú)立的類的類,對象調(diào)用方法時,可以委托當(dāng)前對象所,對象調(diào)用方法時,可以委托當(dāng)前對象所具有的狀態(tài)(對象)調(diào)用相應(yīng)的方法,使得當(dāng)具有的狀態(tài)(對象)調(diào)用相應(yīng)的方法,使得當(dāng)前對象看起來好像修改了它的類。前對象看起來好像修改了它的類。 Bridge案例案例class Thermometer/溫度計(jì)類溫度計(jì)類double temputer;public void showMessage()if( temperature=30)System.out.println(“現(xiàn)在溫度是:現(xiàn)在溫度是:”+temputer);/如果用戶要求如果用戶要求tem

54、perature60?/分離對象狀態(tài)分離對象狀態(tài)Bridge結(jié)構(gòu)與使用結(jié)構(gòu)與使用l模式的結(jié)構(gòu)中包括三種角色模式的結(jié)構(gòu)中包括三種角色l環(huán)境(環(huán)境(Context) l抽象狀態(tài)(抽象狀態(tài)(State) l具體狀態(tài)(具體狀態(tài)(Concrete State)Bridge UMLUML圖圖Bridge描述與使用描述與使用l 1環(huán)境(環(huán)境(Context): Thermometer.java public class Thermometer TemperatureState state; public void showMessage() System.out.println(*); state.show

55、Temperature(); System.out.println(*); public void setState(TemperatureState state) this.state=state; Bridge描述與使用描述與使用l 1環(huán)境(環(huán)境(Context): Thermometer.java public class Thermometer TemperatureState state; public void showMessage() System.out.println(*); state.showTemperature(); System.out.println(*); p

56、ublic void setState(TemperatureState state) this.state=state; Bridge描述與使用描述與使用l 2抽象狀態(tài)(抽象狀態(tài)(State): TemperatureState.javapublic interface TemperatureState public void showTemperature(); Bridge描述與使用描述與使用l 2抽象狀態(tài)(抽象狀態(tài)(State): TemperatureState.javapublic interface TemperatureState public void showTempera

57、ture(); Bridge描述與使用描述與使用l3具體狀態(tài)(具體狀態(tài)(Concrete State):):LowState.java public class LowState implements TemperatureState double n=0; LowState(double n) if(n0&n=39) this.n=n; public void showTemperature() System.out.println(現(xiàn)在溫度是現(xiàn)在溫度是+n+屬于高溫度屬于高溫度); Bridge描述與使用描述與使用l 4應(yīng)用應(yīng)用 Application.java public cl

58、ass Application public static void main(String args) TemperatureState state=new LowState(-12); Thermometer thermometer=new Thermometer(); thermometer.setState(state); thermometer.showMessage(); state=new MiddleState(20); thermometer.setState(state); thermometer.showMessage(); state=new HeightState(3

59、9); thermometer.setState(state); thermometer.showMessage(); Bridge優(yōu)點(diǎn)優(yōu)點(diǎn)l使用一個類封裝對象的一種狀態(tài),很容易增加新的狀態(tài)使用一個類封裝對象的一種狀態(tài),很容易增加新的狀態(tài)。l在狀態(tài)模式中,環(huán)境(在狀態(tài)模式中,環(huán)境(context)中不必出現(xiàn)大量的條)中不必出現(xiàn)大量的條件判斷語句。環(huán)境(件判斷語句。環(huán)境(context)實(shí)例所呈現(xiàn)的狀態(tài)變得)實(shí)例所呈現(xiàn)的狀態(tài)變得更加清晰、容易理解。更加清晰、容易理解。l使用狀態(tài)模式可以讓用戶程序很方便的切換環(huán)境(使用狀態(tài)模式可以讓用戶程序很方便的切換環(huán)境(context)實(shí)例的狀態(tài)。)實(shí)例的狀態(tài)

60、。l使用狀態(tài)模式不會讓環(huán)境(使用狀態(tài)模式不會讓環(huán)境(context)的實(shí)例中出現(xiàn)內(nèi))的實(shí)例中出現(xiàn)內(nèi)部狀態(tài)不一致的情況。部狀態(tài)不一致的情況。l當(dāng)狀態(tài)對象沒有實(shí)例變量時,環(huán)境(當(dāng)狀態(tài)對象沒有實(shí)例變量時,環(huán)境(context)的各個)的各個實(shí)例可以共實(shí)例可以共x享一個狀態(tài)對象。享一個狀態(tài)對象。Proxy - GOF代理模式代理模式 為其他對象提供一種代理以控制對這個對象的訪問。為其他對象提供一種代理以控制對這個對象的訪問。Proxy Pattern Provide a surrogate or placeholder for another object to control access to it. Proxy 概述

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論