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

下載本文檔

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

文檔簡(jiǎn)介

1、設(shè)計(jì)模式-DecoratorDecorator模式模式-GOF裝飾模式(別名:包裝器)裝飾模式(別名:包裝器) 動(dòng)態(tài)地給對(duì)象添加一些額外的職責(zé)。就功能來(lái)說(shuō)裝飾動(dòng)態(tài)地給對(duì)象添加一些額外的職責(zé)。就功能來(lái)說(shuō)裝飾模式相比生成子類更為靈活。模式相比生成子類更為靈活。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裝飾模式是裝飾模式是動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能,而的功能,而不需要改變?cè)碱惔a不需要改變?cè)碱惔a的一種成熟模式。在的一種成熟模式。在裝飾模式中,裝飾模式中,“具體組件具體組件”類和類和“具體裝飾具體裝飾”類是該模式中的最重要的兩個(gè)角色。類是該模式中的最重要的兩個(gè)角色。 Decorator案例案例l指揮部希望按時(shí)得到水文站測(cè)量到的關(guān)于水指揮部希望按時(shí)得到水文站測(cè)量到的關(guān)于水流的信息,比如流量、流速等。流的信息,比如流量、流速等。l假設(shè)系統(tǒng)中有一個(gè)假設(shè)系統(tǒng)中有一個(gè)BirdBird抽象類以及抽象類以及BirdBird類的類

3、的一個(gè)子類:一個(gè)子類:SparrowSparrow。lSparrowSparrow類實(shí)現(xiàn)了類實(shí)現(xiàn)了BirdBird類的類的flyfly方法,使得方法,使得SparrowSparrow類創(chuàng)建的對(duì)象調(diào)用類創(chuàng)建的對(duì)象調(diào)用flyfly方法能連續(xù)飛方法能連續(xù)飛行行100100米。米。l現(xiàn)在用戶需要兩種鳥(niǎo),必須分別能連續(xù)飛行現(xiàn)在用戶需要兩種鳥(niǎo),必須分別能連續(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(這只鳥(niǎo)能飛行這只鳥(niǎo)能飛行+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、裝飾只知道它要),因此具體裝飾只知道它要裝飾的對(duì)象是抽象組件的某一個(gè)子類的實(shí)例裝飾的對(duì)象是抽象組件的某一個(gè)子類的實(shí)例,但不需要知道是哪一個(gè)具體子類。,但不需要知道是哪一個(gè)具體子類。l裝飾模式滿足裝飾模式滿足“開(kāi)開(kāi)-閉原則閉原則”。不必修改具。不必修改具體組件,就可以增加新的針對(duì)該具體組件體組件,就可以增加新的針對(duì)該具體組件的具體裝飾的具體裝飾l可以使用多個(gè)具體裝飾來(lái)裝飾具體組件的可以使用多個(gè)具體裝飾來(lái)裝飾具體組件的實(shí)例。實(shí)例。設(shè)計(jì)模式-AdapterAdapter-GOF適配器模式(別名:包裝器)適配器模式(別名:包裝器) 將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接將一個(gè)類的接口轉(zhuǎn)換成客戶希望的

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

12、機(jī),洗衣機(jī)按著三相插座洗衣機(jī)和一臺(tái)電視機(jī),洗衣機(jī)按著三相插座的標(biāo)準(zhǔn)配有三相插頭,而電視機(jī)按著兩相插的標(biāo)準(zhǔn)配有三相插頭,而電視機(jī)按著兩相插座的標(biāo)準(zhǔn)配有座的標(biāo)準(zhǔn)配有兩相插頭兩相插頭(被適配者)(被適配者)?,F(xiàn)在。現(xiàn)在用戶想用新的用戶想用新的三相插座三相插座(目標(biāo))來(lái)使用洗衣(目標(biāo))來(lái)使用洗衣機(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=長(zhǎng)江電視機(jī)長(zhǎng)江電視機(jī); TV(String s) name=s; public void connectElectricCurrent() turnOn(); public void turnOn() System.out.println(name+開(kāi)始播放節(jié)目。開(kāi)始播放節(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+開(kāi)始洗衣物。開(kāi)始洗衣物。); 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適配器模式滿足適配器模式滿足“開(kāi)開(kāi)-閉原則閉原則”。當(dāng)添加一個(gè)。當(dāng)添加一個(gè)實(shí)現(xiàn)實(shí)現(xiàn)Adaptee接口的新類時(shí),不必修改接口的新類時(shí),不必修改Adapter,Adapter就能對(duì)這個(gè)新類的實(shí)例進(jìn)就能對(duì)這個(gè)新類的實(shí)例進(jìn)行適配。行適配。設(shè)計(jì)模式- FacadeFaade-GOF外觀模式外觀模式為系統(tǒng)中的一組接口提供一個(gè)一致的界面,為系統(tǒng)中的一組接口提供一個(gè)一致的界面,F(xiàn)aade模式模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(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 外觀模式是外觀模式是簡(jiǎn)化用戶和子系統(tǒng)進(jìn)行交互簡(jiǎn)化用戶和子系統(tǒng)進(jìn)行交互的成的成熟模式,外觀模式的關(guān)鍵是為子系統(tǒng)提供一熟模式,外觀模式的關(guān)鍵是為子系統(tǒng)提供一個(gè)稱作個(gè)稱作外觀外觀的類,該外觀類的實(shí)例負(fù)責(zé)和子的類,該外觀類的實(shí)例負(fù)責(zé)和子系統(tǒng)中類的實(shí)例打交道。

20、當(dāng)用戶想要和子系系統(tǒng)中類的實(shí)例打交道。當(dāng)用戶想要和子系統(tǒng)中的若干個(gè)類的實(shí)例打交道時(shí),可以代替統(tǒng)中的若干個(gè)類的實(shí)例打交道時(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é)對(duì)包裹進(jìn)行安全檢查類的實(shí)例負(fù)責(zé)對(duì)包裹進(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因此,一個(gè)要郵寄的包裹的

21、用戶如果直接和因此,一個(gè)要郵寄的包裹的用戶如果直接和負(fù)責(zé)郵寄包裹的子系統(tǒng)的類打交道就會(huì)非常負(fù)責(zé)郵寄包裹的子系統(tǒng)的類打交道就會(huì)非常不方便。不方便。 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 報(bào)社的廣告系統(tǒng)有三個(gè)類報(bào)社的廣告系統(tǒng)有三個(gè)類CheckWord、Charge和和TypeSetting類,各個(gè)類的職責(zé)如類,各個(gè)類的職責(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é)對(duì)廣告進(jìn)行排版。的實(shí)例負(fù)責(zé)對(duì)廣告進(jìn)行排版。l使用外觀模式簡(jiǎn)化用戶和上述子系統(tǒng)所進(jìn)行使用外觀模式簡(jiǎ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ī),價(jià)格鹿花牌洗衣機(jī),價(jià)格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)中的類無(wú)耦合。使客戶和子系統(tǒng)中的類無(wú)耦合。l 外觀只是提供了一個(gè)更加簡(jiǎn)潔的界面,并不外觀只是提供了一個(gè)更加簡(jiǎn)潔的界面,并不影響用戶直接使用子系統(tǒng)中的類。影響用戶直接使用子系統(tǒng)中的類。l子系統(tǒng)中任何類對(duì)其方法的內(nèi)容進(jìn)行修改,子系統(tǒng)中任何類對(duì)其方法的內(nèi)容進(jìn)行修改,不影響外觀的代碼。不影響外觀的代碼。CompositeComposite模式 - GOF組合模式組合模式 將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分部分-整體整體”的層

29、次結(jié)的層次結(jié)構(gòu)。構(gòu)。Composite使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。有一致性。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)于怎樣將對(duì)象形成樹(shù)形結(jié)構(gòu)怎樣將對(duì)象形成樹(shù)形結(jié)構(gòu)來(lái)表現(xiàn)整體和部分

30、的層次結(jié)構(gòu)的來(lái)表現(xiàn)整體和部分的層次結(jié)構(gòu)的成熟模式成熟模式。使用組合模式,可以讓用戶以一致的方。使用組合模式,可以讓用戶以一致的方式處理個(gè)體對(duì)象和組合對(duì)象式處理個(gè)體對(duì)象和組合對(duì)象l組合模式的關(guān)鍵在于無(wú)論是個(gè)體對(duì)象還是組合模式的關(guān)鍵在于無(wú)論是個(gè)體對(duì)象還是組合對(duì)象都實(shí)現(xiàn)了相同的接口或都是同一組合對(duì)象都實(shí)現(xiàn)了相同的接口或都是同一個(gè)抽象類的子類。個(gè)抽象類的子類。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 連長(zhǎng)連長(zhǎng)=new MilitaryOfficer(連長(zhǎng)連長(zhǎng),5000); MilitaryPerson 排長(zhǎng)排長(zhǎng)1=new MilitaryOfficer(一排長(zhǎng)一排長(zhǎng),4000); MilitaryPerson 排長(zhǎng)排長(zhǎng)2=new MilitaryOfficer(二排長(zhǎng)二排長(zhǎng),4000); MilitaryPerson 班長(zhǎng)班長(zhǎng)11=new MilitaryOfficer(一班長(zhǎng)一班長(zhǎng),2000); MilitaryPerson 班長(zhǎng)班長(zhǎng)12=new MilitaryOfficer(二班長(zhǎng)二班長(zhǎng),2000); MilitaryPerson

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

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

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

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

43、對(duì)象和組合對(duì)象。l當(dāng)增加新的當(dāng)增加新的Composite節(jié)點(diǎn)和節(jié)點(diǎn)和Leaf節(jié)點(diǎn)時(shí),用節(jié)點(diǎn)時(shí),用戶的重要代碼不需要作出修改。戶的重要代碼不需要作出修改。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(每平米造價(jià):每平米造價(jià):+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(每平米造價(jià):每平米造價(jià):+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)的代碼時(shí),不影響抽象的代碼,反之?dāng)U展。當(dāng)修改實(shí)現(xiàn)的代碼時(shí),不影響抽象的代碼,反之也一樣。比如,對(duì)于也一樣。比如,對(duì)于19.2.2中的例子,如果具

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

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

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

54、perature60?/分離對(duì)象狀態(tài)分離對(duì)象狀態(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使用一個(gè)類封裝對(duì)象的一種狀態(tài),很容易增加新的狀態(tài)使用一個(gè)類封裝對(duì)象的一種狀態(tài),很容易增加新的狀態(tài)。l在狀態(tài)模式中,環(huán)境(在狀態(tài)模式中,環(huán)境(context)中不必出現(xiàn)大量的條)中不必出現(xiàn)大量的條件判斷語(yǔ)句。環(huán)境(件判斷語(yǔ)句。環(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ì)讓環(huán)境(使用狀態(tài)模式不會(huì)讓環(huán)境(context)的實(shí)例中出現(xiàn)內(nèi))的實(shí)例中出現(xiàn)內(nèi)部狀態(tài)不一致的情況。部狀態(tài)不一致的情況。l當(dāng)狀態(tài)對(duì)象沒(méi)有實(shí)例變量時(shí),環(huán)境(當(dāng)狀態(tài)對(duì)象沒(méi)有實(shí)例變量時(shí),環(huán)境(context)的各個(gè))的各個(gè)實(shí)例可以共實(shí)例可以共x享一個(gè)狀態(tài)對(duì)象。享一個(gè)狀態(tài)對(duì)象。Proxy - GOF代理模式代理模式 為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。Proxy Pattern Provide a surrogate or placeholder for another object to control access to it. Proxy 概述

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論