




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第三章第三章構(gòu)外型方式構(gòu)外型方式 構(gòu)外型方式概述 Adapter方式 Bridge方式 Composite方式 Decorator方式 Faade方式 Flyweight方式 Proxy方式 體驗(yàn)工程體驗(yàn)工程 運(yùn)用Composite方式來(lái)編寫(xiě)如圖3-1所示的二叉樹(shù),然后運(yùn)用深度優(yōu)先搜索法遍歷該二叉樹(shù),并打印出根節(jié)點(diǎn)的高度,運(yùn)轉(zhuǎn)效果如圖3-2所示。 圖圖3-1二叉樹(shù)圖二叉樹(shù)圖 圖圖3-2 二叉樹(shù)遍歷結(jié)果圖二叉樹(shù)遍歷結(jié)果圖構(gòu)外型方式概述構(gòu)外型方式概述 構(gòu)外型方式是為處理怎樣組裝現(xiàn)有的類(lèi),設(shè)計(jì)他們的交互方式,從而到構(gòu)外型方式是為處理怎樣組裝現(xiàn)有的類(lèi),設(shè)計(jì)他們的交互方式,從而到達(dá)實(shí)現(xiàn)一定的功能的目的。
2、同時(shí),構(gòu)外型方式包容了對(duì)很多問(wèn)題的處理,達(dá)實(shí)現(xiàn)一定的功能的目的。同時(shí),構(gòu)外型方式包容了對(duì)很多問(wèn)題的處理,例如擴(kuò)展性例如擴(kuò)展性(外觀方式,組成方式,代理方式,裝飾方式,封裝性適外觀方式,組成方式,代理方式,裝飾方式,封裝性適配器方式,橋接方式。配器方式,橋接方式。 構(gòu)外型方式中處理了以下幾個(gè)問(wèn)題:構(gòu)外型方式中處理了以下幾個(gè)問(wèn)題:在不破壞類(lèi)封裝性的根底上,實(shí)現(xiàn)新的功能。這一點(diǎn)包括裝飾方式,在不破壞類(lèi)封裝性的根底上,實(shí)現(xiàn)新的功能。這一點(diǎn)包括裝飾方式,代理方式。代理方式。 在不破壞類(lèi)封裝性的根底上,使得類(lèi)可以同不曾估計(jì)到的系統(tǒng)進(jìn)展在不破壞類(lèi)封裝性的根底上,使得類(lèi)可以同不曾估計(jì)到的系統(tǒng)進(jìn)展交互。這一點(diǎn)包
3、括橋接和適配器方式。交互。這一點(diǎn)包括橋接和適配器方式。 創(chuàng)建一組類(lèi)的一致訪問(wèn)接口,這是組成方式。創(chuàng)建一組類(lèi)的一致訪問(wèn)接口,這是組成方式。 對(duì)同一類(lèi)創(chuàng)建不同的訪問(wèn)界面,提供應(yīng)不同需求的訪問(wèn)者,這是外觀對(duì)同一類(lèi)創(chuàng)建不同的訪問(wèn)界面,提供應(yīng)不同需求的訪問(wèn)者,這是外觀方式。方式。 Adapter方式方式 適配器方式有類(lèi)適配器和對(duì)象匹配器兩種方式。其中類(lèi)適配器運(yùn)用多承繼適配器方式有類(lèi)適配器和對(duì)象匹配器兩種方式。其中類(lèi)適配器運(yùn)用多承繼由于由于java不支持多承繼,所以可以引入接口的概念來(lái)實(shí)現(xiàn)一個(gè)接口對(duì)不支持多承繼,所以可以引入接口的概念來(lái)實(shí)現(xiàn)一個(gè)接口對(duì)另一個(gè)接口的匹配,對(duì)象適配器主要依賴(lài)于對(duì)象組合來(lái)實(shí)現(xiàn)接口
4、的匹配。另一個(gè)接口的匹配,對(duì)象適配器主要依賴(lài)于對(duì)象組合來(lái)實(shí)現(xiàn)接口的匹配。比如比如java窗體事件處置的事件適配器就是一個(gè)很好的例子。窗體事件處置的事件適配器就是一個(gè)很好的例子。 方式引見(jiàn)方式引見(jiàn) 主要適用于以下情況:主要適用于以下情況: 運(yùn)用一個(gè)曾經(jīng)存在的類(lèi),而它的接口不符合他的需求。運(yùn)用一個(gè)曾經(jīng)存在的類(lèi),而它的接口不符合他的需求。 創(chuàng)建一個(gè)可以復(fù)用的類(lèi),該類(lèi)可以與其他不相關(guān)的類(lèi)或不可預(yù)見(jiàn)創(chuàng)建一個(gè)可以復(fù)用的類(lèi),該類(lèi)可以與其他不相關(guān)的類(lèi)或不可預(yù)見(jiàn)的類(lèi)即那些接口能夠不一定兼容的類(lèi)協(xié)同任務(wù)。的類(lèi)即那些接口能夠不一定兼容的類(lèi)協(xié)同任務(wù)。 運(yùn)用一些曾經(jīng)存在的子類(lèi),但是不能夠?qū)γ恳粋€(gè)都進(jìn)展子類(lèi)化以匹配運(yùn)用一
5、些曾經(jīng)存在的子類(lèi),但是不能夠?qū)γ恳粋€(gè)都進(jìn)展子類(lèi)化以匹配它們的接口。對(duì)象適配器可以適配它的父類(lèi)接口,僅適用于對(duì)象適配它們的接口。對(duì)象適配器可以適配它的父類(lèi)接口,僅適用于對(duì)象適配器。器。 Adapter方式構(gòu)造圖方式構(gòu)造圖適配器方式構(gòu)造圖如下: 類(lèi)適配器構(gòu)造圖類(lèi)適配器構(gòu)造圖 對(duì)象適配器構(gòu)造圖對(duì)象適配器構(gòu)造圖 Target:定義:定義Client運(yùn)用的與特定運(yùn)用或領(lǐng)域相關(guān)的接口。運(yùn)用的與特定運(yùn)用或領(lǐng)域相關(guān)的接口。 Adaptee:定義一個(gè)曾經(jīng)存在的類(lèi),該類(lèi)需求適配。:定義一個(gè)曾經(jīng)存在的類(lèi),該類(lèi)需求適配。 Adapter:對(duì):對(duì)Adaptee類(lèi)和類(lèi)和Target接口進(jìn)展適配。接口進(jìn)展適配。Client
6、經(jīng)過(guò)經(jīng)過(guò)Adapter實(shí)實(shí)例對(duì)象來(lái)調(diào)用某些方法,然后適配器調(diào)用例對(duì)象來(lái)調(diào)用某些方法,然后適配器調(diào)用Adaptee的方法來(lái)實(shí)現(xiàn)懇求的方法來(lái)實(shí)現(xiàn)懇求適配器方式例如適配器方式例如比如我們編寫(xiě)過(guò)兩個(gè)類(lèi),分別用于畫(huà)圓形樁和方形樁,假設(shè)如今有一個(gè)比如我們編寫(xiě)過(guò)兩個(gè)類(lèi),分別用于畫(huà)圓形樁和方形樁,假設(shè)如今有一個(gè)運(yùn)用,需求既畫(huà)方形樁,又要畫(huà)圓形樁,就可以運(yùn)用該方式實(shí)現(xiàn)。運(yùn)用,需求既畫(huà)方形樁,又要畫(huà)圓形樁,就可以運(yùn)用該方式實(shí)現(xiàn)。 運(yùn)用對(duì)象適配器運(yùn)用對(duì)象適配器 方式實(shí)現(xiàn)如下:方式實(shí)現(xiàn)如下:public class DrawRoundpublic void displayRound(String msg)System
7、.out.println(DrawRound displayRound():+msg);public class DrawSquarepublic void displaySquare(String str)System.out.println(DrawSquare displaySquare():+str); public class ShapeAdapter extends DrawSquareprivate DrawRound round;public ShapeAdapter(DrawRound r)this.round=r;public void insertRound(String
8、 str)round.displayRound(str);運(yùn)用類(lèi)適配器運(yùn)用類(lèi)適配器 方式實(shí)現(xiàn)如下:方式實(shí)現(xiàn)如下:public interface DrawRoundInterfacepublic void displayRound(String msg);public class DrawRound implements DrawRoundInterface public void displayRound(String msg)System.out.println(DrawRound displayRound():+msg);public class ShapeAdapter extends
9、 DrawSquare implements DrawRoundInterfaceprivate DrawRound round;public ShapeAdapter(DrawRound r)this.round=r;public void displayRound(String msg)round.displayRound(msg);/doSomethingpublic class Client public static void main(String args) ShapeAdapter d=new ShapeAdapter(new DrawRound();d.insertRound
10、(圓形圓形);d.displaySquare(方形方形);Adapter方式優(yōu)勢(shì)和缺乏方式優(yōu)勢(shì)和缺乏 類(lèi)適配器的優(yōu)缺陷如下類(lèi)適配器的優(yōu)缺陷如下 :用一個(gè)詳細(xì)的用一個(gè)詳細(xì)的Adapter類(lèi)對(duì)類(lèi)對(duì)Adaptee和和Target進(jìn)展匹配。結(jié)果是當(dāng)我們進(jìn)展匹配。結(jié)果是當(dāng)我們想要匹配一個(gè)類(lèi)以及一切它的子類(lèi)時(shí),類(lèi)想要匹配一個(gè)類(lèi)以及一切它的子類(lèi)時(shí),類(lèi)Adapter將不能勝任任務(wù)。將不能勝任任務(wù)。 使得使得Adapter可以重定義可以重定義Adaptee的部分行為。的部分行為。對(duì)象適配器的優(yōu)缺陷如下:對(duì)象適配器的優(yōu)缺陷如下:允許一個(gè)允許一個(gè)Adapter與多個(gè)與多個(gè)Adaptee,即,即Adaptee本身以及
11、它的一切子類(lèi)本身以及它的一切子類(lèi)假設(shè)有子類(lèi)的話同時(shí)任務(wù)。假設(shè)有子類(lèi)的話同時(shí)任務(wù)。 使得重定義使得重定義Adaptee的行為比較困難。的行為比較困難。 僅僅引入了一個(gè)對(duì)象,并不需求額外的援用指針以間接得到僅僅引入了一個(gè)對(duì)象,并不需求額外的援用指針以間接得到Adaptee。 Bridge方式方式在面向?qū)ο笤O(shè)計(jì)的根本概念中,對(duì)象這個(gè)概念實(shí)踐上是由屬性和行為兩個(gè)在面向?qū)ο笤O(shè)計(jì)的根本概念中,對(duì)象這個(gè)概念實(shí)踐上是由屬性和行為兩個(gè)部分組成的,屬性我們可以以為是一種靜止的,一種籠統(tǒng)的。普通情況下,部分組成的,屬性我們可以以為是一種靜止的,一種籠統(tǒng)的。普通情況下,行為是包含在一個(gè)對(duì)象中,但是在有些情況下,我們需
12、求將這些行為也進(jìn)行為是包含在一個(gè)對(duì)象中,但是在有些情況下,我們需求將這些行為也進(jìn)展歸類(lèi),構(gòu)成一個(gè)總的行為接口,這就是橋接方式的用途。展歸類(lèi),構(gòu)成一個(gè)總的行為接口,這就是橋接方式的用途。方式引見(jiàn)方式引見(jiàn) 主要適用于以下情況:主要適用于以下情況: 不希望在籠統(tǒng)和它的實(shí)現(xiàn)部分之間有一個(gè)固定的綁定關(guān)系。不希望在籠統(tǒng)和它的實(shí)現(xiàn)部分之間有一個(gè)固定的綁定關(guān)系。類(lèi)的籠統(tǒng)以及它的實(shí)現(xiàn)都應(yīng)該可以經(jīng)過(guò)生成子類(lèi)的方法加以擴(kuò)展。類(lèi)的籠統(tǒng)以及它的實(shí)現(xiàn)都應(yīng)該可以經(jīng)過(guò)生成子類(lèi)的方法加以擴(kuò)展。 在多個(gè)對(duì)象間共享實(shí)現(xiàn)能夠運(yùn)用援用計(jì)數(shù),但同時(shí)要求客戶(hù)在多個(gè)對(duì)象間共享實(shí)現(xiàn)能夠運(yùn)用援用計(jì)數(shù),但同時(shí)要求客戶(hù)并不知道這一點(diǎn)。并不知道這一點(diǎn)
13、。 Bridge方式構(gòu)造圖方式構(gòu)造圖橋接方式構(gòu)造圖如下: Abstraction:定義籠統(tǒng)類(lèi)接口,并維護(hù)一個(gè):定義籠統(tǒng)類(lèi)接口,并維護(hù)一個(gè)Implementor類(lèi)型對(duì)類(lèi)型對(duì)象。象。 RefinedAbstraction:籠統(tǒng)類(lèi)的詳細(xì)實(shí)現(xiàn)。:籠統(tǒng)類(lèi)的詳細(xì)實(shí)現(xiàn)。 Implementor:實(shí)現(xiàn)層的籠統(tǒng)父類(lèi)接口,提供根本操作,以供:實(shí)現(xiàn)層的籠統(tǒng)父類(lèi)接口,提供根本操作,以供籠統(tǒng)層次的類(lèi)調(diào)用?;\統(tǒng)層次的類(lèi)調(diào)用。ConcreteImplementor:Implementor的詳細(xì)實(shí)現(xiàn)。的詳細(xì)實(shí)現(xiàn)。 Bridge方式例如方式例如public abstract class InforListInforlistFo
14、rmat Format;public void setFormat(InforlistFormat Format) this.Format = Format;public InforlistFormat getFormat() return this.Format;public abstract void distributeInforList();public abstract class InforlistFormatpublic abstract void formatImpl();public class StudentInforList extends InforListpublic
15、 void distributeInforList( )System.out.println(這是學(xué)生信息單這是學(xué)生信息單);InforlistFormat format=this.getFormat();format.formatImpl();public class TeacherInforList extends InforListpublic void distributeInforList()System.out.println(這是教師信息單這是教師信息單);InforlistFormat format=this.getFormat();format.formatImpl();pu
16、blic class HtmlFormat extends InforlistFormatpublic void formatImpl()System.out.println(運(yùn)用運(yùn)用HTML格式生成格式生成);public class PlainTextFormat extends InforlistFormatpublic void formatImpl()System.out.println(運(yùn)用純文本格式生成運(yùn)用純文本格式生成);Bridge方式優(yōu)勢(shì)和缺乏方式優(yōu)勢(shì)和缺乏 缺乏:缺乏:Bridge方式的運(yùn)用普通用于方式的運(yùn)用普通用于“兩個(gè)非常強(qiáng)的變化維度,有時(shí)即使有兩個(gè)兩個(gè)非常強(qiáng)的變化維
17、度,有時(shí)即使有兩個(gè)變化的維度,但是某個(gè)方向的變化維度并不猛烈,換言之兩個(gè)變化不會(huì)變化的維度,但是某個(gè)方向的變化維度并不猛烈,換言之兩個(gè)變化不會(huì)導(dǎo)致縱橫交錯(cuò)的結(jié)果,并沒(méi)必要運(yùn)用導(dǎo)致縱橫交錯(cuò)的結(jié)果,并沒(méi)必要運(yùn)用Bridge方式。方式。 分別籠統(tǒng)部分及其實(shí)現(xiàn)部分。分別籠統(tǒng)部分及其實(shí)現(xiàn)部分。 提高可擴(kuò)展性??梢元?dú)立的對(duì)籠統(tǒng)部分和實(shí)現(xiàn)部分進(jìn)展擴(kuò)展。提高可擴(kuò)展性??梢元?dú)立的對(duì)籠統(tǒng)部分和實(shí)現(xiàn)部分進(jìn)展擴(kuò)展。 Bridge方式是比多承繼方案更好的一種處理方法。方式是比多承繼方案更好的一種處理方法。 Bridge方式主要有以下一些優(yōu)點(diǎn):方式主要有以下一些優(yōu)點(diǎn): 向客戶(hù)隱藏了實(shí)現(xiàn)部分,從而當(dāng)需求擴(kuò)展向客戶(hù)隱藏了實(shí)現(xiàn)
18、部分,從而當(dāng)需求擴(kuò)展/更改實(shí)現(xiàn)部分時(shí),不需更改實(shí)現(xiàn)部分時(shí),不需求重新編譯客戶(hù)代碼。求重新編譯客戶(hù)代碼。 Composite方式方式 Composite方式即合成方式,將對(duì)象組織到樹(shù)構(gòu)造中,可以用來(lái)描畫(huà)整體方式即合成方式,將對(duì)象組織到樹(shù)構(gòu)造中,可以用來(lái)描畫(huà)整體與部分的關(guān)系。合成方式可以使客戶(hù)端將簡(jiǎn)單元素與復(fù)合元素同等對(duì)待。與部分的關(guān)系。合成方式可以使客戶(hù)端將簡(jiǎn)單元素與復(fù)合元素同等對(duì)待。如文件夾與文件就是合成方式的典型運(yùn)用。如文件夾與文件就是合成方式的典型運(yùn)用。 方式引見(jiàn)方式引見(jiàn) 主要適用于以下情況:主要適用于以下情況: 需求表示對(duì)象的部分和整體的層次構(gòu)造。需求表示對(duì)象的部分和整體的層次構(gòu)造。 希
19、望用戶(hù)忽略組合對(duì)象與單個(gè)對(duì)象的區(qū)別,用戶(hù)將一致運(yùn)用組合希望用戶(hù)忽略組合對(duì)象與單個(gè)對(duì)象的區(qū)別,用戶(hù)將一致運(yùn)用組合構(gòu)造中的一切對(duì)象。構(gòu)造中的一切對(duì)象。 Composite方式構(gòu)造圖方式構(gòu)造圖合成方式構(gòu)造圖如下: Component:為組合中的對(duì)象聲明接口,定義一切類(lèi)共有接口的缺:為組合中的對(duì)象聲明接口,定義一切類(lèi)共有接口的缺省行為。省行為。 Leaf:表示葉子節(jié)點(diǎn),葉子節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)。:表示葉子節(jié)點(diǎn),葉子節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)。 Composite:一切可以包含子節(jié)點(diǎn)的類(lèi)都擴(kuò)展這個(gè)類(lèi)。這個(gè)類(lèi)的主:一切可以包含子節(jié)點(diǎn)的類(lèi)都擴(kuò)展這個(gè)類(lèi)。這個(gè)類(lèi)的主要功能是用來(lái)存儲(chǔ)子部件,實(shí)現(xiàn)了接口中的方法。要功能是用來(lái)存儲(chǔ)子部
20、件,實(shí)現(xiàn)了接口中的方法。Client:經(jīng)過(guò)接口支配組合部件的對(duì)象。:經(jīng)過(guò)接口支配組合部件的對(duì)象。 Composite方式例如方式例如public abstract class Computer protected String name;public Computer(String name) = name;public abstract void getPart();import java.util.*;public class ComputerPart extends Computerprotected Vector part = new Vector();public
21、 ComputerPart(String name)super(name);public void getPart()System.out.println(name);System.out.println(name+中的部件:中的部件:);for(int i=0;ipart.size();i+)Computer c=(Computer)part.get(i);c.getPart();public void add(Computer c) part.add(c);public void remove(Computer c) part.remove(c); public class ChildPa
22、rt extends Computer public ChildPart(String name)super(name);public void getPart()System.out.println(name);Composite方式優(yōu)勢(shì)和缺乏方式優(yōu)勢(shì)和缺乏 Composite方式采用樹(shù)形構(gòu)造來(lái)實(shí)現(xiàn)普遍存在的對(duì)象容器,從而將方式采用樹(shù)形構(gòu)造來(lái)實(shí)現(xiàn)普遍存在的對(duì)象容器,從而將“一一對(duì)多的關(guān)系轉(zhuǎn)化為對(duì)多的關(guān)系轉(zhuǎn)化為“一對(duì)一的關(guān)系,一對(duì)一的關(guān)系, 將將“客戶(hù)代碼與復(fù)雜的對(duì)象容器構(gòu)造解耦客戶(hù)代碼與復(fù)雜的對(duì)象容器構(gòu)造解耦 ,解耦之后,客戶(hù)端代,解耦之后,客戶(hù)端代碼將與純粹的籠統(tǒng)接口,而非對(duì)象容器的復(fù)內(nèi)部
23、實(shí)現(xiàn)構(gòu)造,發(fā)生依碼將與純粹的籠統(tǒng)接口,而非對(duì)象容器的復(fù)內(nèi)部實(shí)現(xiàn)構(gòu)造,發(fā)生依賴(lài)關(guān)系,從而更能賴(lài)關(guān)系,從而更能“應(yīng)對(duì)變化。應(yīng)對(duì)變化。 Composite方式中,是將方式中,是將“Add和和Remove等和對(duì)象容器相關(guān)的方法等和對(duì)象容器相關(guān)的方法定義在定義在“表示籠統(tǒng)對(duì)象的表示籠統(tǒng)對(duì)象的Component類(lèi)中,還是將其定義在類(lèi)中,還是將其定義在“表表示對(duì)象容器的示對(duì)象容器的Composite類(lèi)中,是一個(gè)關(guān)乎類(lèi)中,是一個(gè)關(guān)乎“透明性和透明性和“平安性平安性的兩難問(wèn)題,需求仔細(xì)權(quán)衡。這里有能夠違反面向?qū)ο蟮牡膬呻y問(wèn)題,需求仔細(xì)權(quán)衡。這里有能夠違反面向?qū)ο蟮摹皢我粏我宦氊?zé)原那么,但是對(duì)于這種特殊構(gòu)造,這又
24、是必需付出的代價(jià)。職責(zé)原那么,但是對(duì)于這種特殊構(gòu)造,這又是必需付出的代價(jià)。 Bridge方式優(yōu)點(diǎn)和缺乏:方式優(yōu)點(diǎn)和缺乏: Composite方式在詳細(xì)實(shí)現(xiàn)中,可以讓父對(duì)象中的子對(duì)象反向追溯方式在詳細(xì)實(shí)現(xiàn)中,可以讓父對(duì)象中的子對(duì)象反向追溯 Decorator方式方式 Decorator方式即裝飾方式,是指動(dòng)態(tài)的給一個(gè)對(duì)象添加一些額外的職責(zé),方式即裝飾方式,是指動(dòng)態(tài)的給一個(gè)對(duì)象添加一些額外的職責(zé),在在Java 的的IO操作中,經(jīng)常會(huì)用到諸如如下的語(yǔ)句:操作中,經(jīng)常會(huì)用到諸如如下的語(yǔ)句: 方式引見(jiàn)方式引見(jiàn) 主要適用于以下情況:主要適用于以下情況: 在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)
25、象添加在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加方法?;蛘咛幹媚切┛梢缘蹁N(xiāo)的方法。方法?;蛘咛幹媚切┛梢缘蹁N(xiāo)的方法。 當(dāng)不能采用生成子類(lèi)的方式進(jìn)展擴(kuò)展時(shí)。當(dāng)不能采用生成子類(lèi)的方式進(jìn)展擴(kuò)展時(shí)。BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(D:a.txt);while(br.readLine()!=null)System.out.println(br.readLine();在該代碼中運(yùn)用多個(gè)的在該代碼中運(yùn)用多個(gè)的Decorator被層疊在一同,最后得
26、到一個(gè)功能強(qiáng)大被層疊在一同,最后得到一個(gè)功能強(qiáng)大的流。既可以被緩沖,又可以得到行數(shù),的流。既可以被緩沖,又可以得到行數(shù), Decorator方式構(gòu)造圖方式構(gòu)造圖裝飾方式構(gòu)造圖如下: Component:定義一個(gè)對(duì)象接口,以規(guī)范預(yù)備接納附加責(zé)任的對(duì)象。:定義一個(gè)對(duì)象接口,以規(guī)范預(yù)備接納附加責(zé)任的對(duì)象。 ConcreteComponent:定義一個(gè)將要接納附加責(zé)任的類(lèi)。:定義一個(gè)將要接納附加責(zé)任的類(lèi)。 Decorator:持有一個(gè)組件對(duì)象的實(shí)例,并定義一個(gè)與籠統(tǒng)組件接:持有一個(gè)組件對(duì)象的實(shí)例,并定義一個(gè)與籠統(tǒng)組件接口一致的接口??谝恢碌慕涌凇?ConcreteDecorator:擔(dān)任給組件對(duì)象:擔(dān)
27、任給組件對(duì)象“貼上附加的責(zé)任。貼上附加的責(zé)任。Decorator方式例如方式例如public interface Phone public void use();public class HomePhone implements Phonepublic void use() System.out.println(打、接打、接); public class Decorator implements PhonePhone phone;public Decorator(Phone phone) this.phone=phone; public void use( ) phone.use( ); pu
28、blic class AutoDecorator extends Decorator public AutoDecorator(Phone phone)super(phone);public void use( )phone.use( );System.out.println(裝配自動(dòng)回復(fù)功能裝配自動(dòng)回復(fù)功能);public class WatchDecorator extends Decorator public WatchDecorator(Phone phone)super(phone);public void use( )phone.use( );System.out.println(
29、裝配可視功能裝配可視功能); public class Client public static void main(String args) Phone p=new HomePhone( );p.use();/添加自動(dòng)回復(fù)功能添加自動(dòng)回復(fù)功能Phone p1=new Decorator(new AutoDecorator(p);p1.use( );/添加自動(dòng)回復(fù)功能和可視功能添加自動(dòng)回復(fù)功能和可視功能Phone p2=new Decorator(new WatchDecorator(new AutoDecorator(p);p2.use();Decorator方式優(yōu)勢(shì)和缺乏方式優(yōu)勢(shì)和缺乏 D
30、ecorator方式主要有以下幾點(diǎn)優(yōu)勢(shì):方式主要有以下幾點(diǎn)優(yōu)勢(shì):比靜態(tài)承繼更靈敏。比靜態(tài)承繼更靈敏。 防止了在層次構(gòu)造中高層的類(lèi)有太多的特性。防止了在層次構(gòu)造中高層的類(lèi)有太多的特性。Decorator方式提供了一方式提供了一種種“即用即付的方法來(lái)添加職責(zé)。即用即付的方法來(lái)添加職責(zé)。 Decorator方式的缺乏之處主要在于有太多的小對(duì)象。采用方式的缺乏之處主要在于有太多的小對(duì)象。采用Decorator方式方式進(jìn)展設(shè)計(jì)往往會(huì)產(chǎn)生許多看上去類(lèi)似的小對(duì)象,這些對(duì)象僅僅在它們相互進(jìn)展設(shè)計(jì)往往會(huì)產(chǎn)生許多看上去類(lèi)似的小對(duì)象,這些對(duì)象僅僅在它們相互銜接的方式上有所不同,所以在排錯(cuò)時(shí)會(huì)很困難。銜接的方式上有所
31、不同,所以在排錯(cuò)時(shí)會(huì)很困難。 Decorator方式缺乏方式缺乏Facade方式方式 Facade方式外觀方式的意圖是:為子系統(tǒng)中的一組接口提供一致的方式外觀方式的意圖是:為子系統(tǒng)中的一組接口提供一致的界面,界面,F(xiàn)acade方式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加方式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易運(yùn)用。容易運(yùn)用。 方式引見(jiàn)方式引見(jiàn) 主要適用于以下情況:主要適用于以下情況: 當(dāng)要為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口時(shí)。當(dāng)要為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口時(shí)。 客戶(hù)程序與籠統(tǒng)類(lèi)的實(shí)現(xiàn)部分之間存在著很大的依賴(lài)性??蛻?hù)程序與籠統(tǒng)類(lèi)的實(shí)現(xiàn)部分之間存在著很大的依賴(lài)性。 當(dāng)需求構(gòu)
32、建一個(gè)層次構(gòu)造的子系統(tǒng)時(shí),運(yùn)用當(dāng)需求構(gòu)建一個(gè)層次構(gòu)造的子系統(tǒng)時(shí),運(yùn)用Facade方式定義子系方式定義子系統(tǒng)中每層的入口點(diǎn)。統(tǒng)中每層的入口點(diǎn)。 Facade方式構(gòu)造圖方式構(gòu)造圖外觀方式構(gòu)造圖如下: Facade:知道哪些子系統(tǒng)類(lèi)擔(dān)任處置懇求,將客戶(hù)的懇求代理給:知道哪些子系統(tǒng)類(lèi)擔(dān)任處置懇求,將客戶(hù)的懇求代理給適當(dāng)?shù)淖酉到y(tǒng)對(duì)象。適當(dāng)?shù)淖酉到y(tǒng)對(duì)象。 子系統(tǒng)類(lèi)子系統(tǒng)類(lèi)Subsystem classes:實(shí)現(xiàn)子系統(tǒng)的功能,處置由:實(shí)現(xiàn)子系統(tǒng)的功能,處置由Facade對(duì)象指派的義務(wù)。對(duì)象指派的義務(wù)。 Facade方式例如方式例如import java.sql.*;public class Client p
33、ublic static void main(String args) DBConnection b=new DBConnection();b.setDriver(com.microsoft.jdbc.sqlserver.SQLServerDriver);b.setServername(lacalhost);b.setDBname(pubs);tryConnection c=b.connect();ResultSet rs=c.createStatement().executeQuery(select * from sale);while(rs.next()System.out.println
34、(rs.getString(1);catch(Exception e)System.out.println(e);class DBConnection String driver,servername,dbname;public void setDriver(String driver) this.driver=driver; public void setServername(String servername)this.servername= servername;public void setDBname(String dbname) this.dbname= dbname; publi
35、c Connection connect() try Class.forName(driver);Connection cn = DriverManager.getConnection(jdbc:microsoft:sqlserver“+ servername+:1433;databasename=+dbname, sa, );System.out.println(信息提示:銜接信息提示:銜接 +servername + 效力器效力器 + dbname +數(shù)據(jù)庫(kù)已勝利!數(shù)據(jù)庫(kù)已勝利!);return cn; catch (Exception e) System.out.println(信息提示
36、:銜接信息提示:銜接 + servername + 效力器效力器+ dbname +失??!失??!n + e);return null;Facade方式優(yōu)勢(shì)和缺乏方式優(yōu)勢(shì)和缺乏 Facade方式主要有以下幾點(diǎn)優(yōu)勢(shì):方式主要有以下幾點(diǎn)優(yōu)勢(shì):對(duì)客戶(hù)屏蔽子系統(tǒng)組件,因此減少了客戶(hù)處置的對(duì)象的數(shù)目,使得子對(duì)客戶(hù)屏蔽子系統(tǒng)組件,因此減少了客戶(hù)處置的對(duì)象的數(shù)目,使得子系統(tǒng)運(yùn)用起來(lái)更加方便。系統(tǒng)運(yùn)用起來(lái)更加方便。 實(shí)現(xiàn)了子系統(tǒng)與客戶(hù)間的松耦合關(guān)系。松耦合關(guān)系使得子系統(tǒng)的組實(shí)現(xiàn)了子系統(tǒng)與客戶(hù)間的松耦合關(guān)系。松耦合關(guān)系使得子系統(tǒng)的組件變化不會(huì)影響到客戶(hù)端。件變化不會(huì)影響到客戶(hù)端。 Facade方式缺乏方式缺乏Fa
37、cade方式的缺陷主要在于運(yùn)用方式的缺陷主要在于運(yùn)用Facade方式時(shí),要定義方式時(shí),要定義interface是很費(fèi)是很費(fèi)事的一件事情,特別是在內(nèi)部類(lèi)所能提供的方法還沒(méi)確定或外部所需功事的一件事情,特別是在內(nèi)部類(lèi)所能提供的方法還沒(méi)確定或外部所需功能還沒(méi)確定的時(shí)候尤為如此。能還沒(méi)確定的時(shí)候尤為如此。 Flyweight方式方式 Flyweight方式即享元方式,該方式的意圖是防止大量擁有一樣內(nèi)容的小方式即享元方式,該方式的意圖是防止大量擁有一樣內(nèi)容的小類(lèi)的開(kāi)銷(xiāo)如耗費(fèi)內(nèi)存,使大家共享一個(gè)類(lèi)元類(lèi)。類(lèi)的開(kāi)銷(xiāo)如耗費(fèi)內(nèi)存,使大家共享一個(gè)類(lèi)元類(lèi)。享元方式以共享的方式高效的支持大量的細(xì)粒度對(duì)象。享元方式能做到
38、共享元方式以共享的方式高效的支持大量的細(xì)粒度對(duì)象。享元方式能做到共享的關(guān)鍵是區(qū)分內(nèi)部形狀和外部形狀。享的關(guān)鍵是區(qū)分內(nèi)部形狀和外部形狀。Flyweight方式是一個(gè)提高程序效率和性能的方式,會(huì)大大加快程序的運(yùn)方式是一個(gè)提高程序效率和性能的方式,會(huì)大大加快程序的運(yùn)轉(zhuǎn)速度。運(yùn)用場(chǎng)所很多,比如他要從一個(gè)數(shù)據(jù)庫(kù)中讀取一系列字符串,這轉(zhuǎn)速度。運(yùn)用場(chǎng)所很多,比如他要從一個(gè)數(shù)據(jù)庫(kù)中讀取一系列字符串,這些字符串中有許多是反復(fù)的,那么我們可以將這些字符串儲(chǔ)存在些字符串中有許多是反復(fù)的,那么我們可以將這些字符串儲(chǔ)存在Flyweight池池(pool)中。中。 方式引見(jiàn)方式引見(jiàn) 當(dāng)以下情況都成立時(shí)運(yùn)用當(dāng)以下情況都成立
39、時(shí)運(yùn)用Flyweight方式:方式: 一個(gè)運(yùn)用程序運(yùn)用了大量的對(duì)象。一個(gè)運(yùn)用程序運(yùn)用了大量的對(duì)象。 由于運(yùn)用了大量的對(duì)象,呵斥很大的開(kāi)銷(xiāo)。由于運(yùn)用了大量的對(duì)象,呵斥很大的開(kāi)銷(xiāo)。 假設(shè)刪除對(duì)象的外部形狀,就可以運(yùn)用相對(duì)較少的共享對(duì)象來(lái)取假設(shè)刪除對(duì)象的外部形狀,就可以運(yùn)用相對(duì)較少的共享對(duì)象來(lái)取代很多組對(duì)象。代很多組對(duì)象。 運(yùn)用程序不依賴(lài)于對(duì)象標(biāo)識(shí)。運(yùn)用程序不依賴(lài)于對(duì)象標(biāo)識(shí)。 Flyweight方式構(gòu)造圖方式構(gòu)造圖享元方式構(gòu)造圖如下: Flyweight:描畫(huà)一個(gè)接口,經(jīng)過(guò)這個(gè)接口:描畫(huà)一個(gè)接口,經(jīng)過(guò)這個(gè)接口Flyweight例如對(duì)象可例如對(duì)象可接受并作用于外部形狀。接受并作用于外部形狀。 Unsh
40、aredConcreteFlyweight:并非一切的:并非一切的Flyweight子類(lèi)都需求被共享,子類(lèi)都需求被共享, UnsharedConcreteFlyweight對(duì)象通常將對(duì)象通常將ConcreteFlyweight對(duì)象作為子節(jié)對(duì)象作為子節(jié)點(diǎn)。點(diǎn)。 FlyweightFactory:創(chuàng)建并管理:創(chuàng)建并管理Flyweight對(duì)象,確保合理的共享對(duì)象,確保合理的共享Flyweight 。ConcreteFlyweight:實(shí)現(xiàn):實(shí)現(xiàn)Flyweight接口,并為內(nèi)部形狀添加存儲(chǔ)空間。接口,并為內(nèi)部形狀添加存儲(chǔ)空間。 Flyweight方式例如方式例如public interface Fly
41、weightpublic abstract void operation();public class ConcreteFlyweight implements Flyweightprivate String string;public ConcreteFlyweight(String str) string = str;public void operation()System.out.println(Concrete-Flyweight : + string);import java.util.Hashtable;public class FlyweightFactoryprivate H
42、ashtable flyweights = new Hashtable();public Flyweight getFlyWeight(Object obj)Flyweight flyweight = (Flyweight) flyweights.get(obj);if (flyweight = = null) /產(chǎn)生新的產(chǎn)生新的ConcreteFlyweightflyweight = new ConcreteFlyweight(obj.toString();flyweights.put(obj, flyweight);return flyweight;public int getFlywei
43、ghtSize()return flyweights.size();FlyweightFactory對(duì)象提供了對(duì)象提供了一個(gè)已創(chuàng)建的實(shí)例,假設(shè)該實(shí)一個(gè)已創(chuàng)建的實(shí)例,假設(shè)該實(shí)例沒(méi)有,例沒(méi)有,F(xiàn)lyweightFactory對(duì)對(duì)象就創(chuàng)建一個(gè)。象就創(chuàng)建一個(gè)。 Flyweight方式優(yōu)勢(shì)和缺乏方式優(yōu)勢(shì)和缺乏 Flyweight方式優(yōu)勢(shì):方式優(yōu)勢(shì):Flyweight方式缺乏:方式缺乏:Flyweight方式主要是對(duì)存儲(chǔ)的節(jié)約,共享的方式主要是對(duì)存儲(chǔ)的節(jié)約,共享的Flyweight越多,存儲(chǔ)節(jié)約也越多,存儲(chǔ)節(jié)約也就越多,節(jié)約量隨著共享形狀的增多而增大??梢赃\(yùn)用兩種方法來(lái)節(jié)約就越多,節(jié)約量隨著共享形狀的增多
44、而增大??梢赃\(yùn)用兩種方法來(lái)節(jié)約存儲(chǔ),即使用共享來(lái)減少內(nèi)部形狀的耗費(fèi)和用計(jì)算時(shí)間換取對(duì)外部形狀存儲(chǔ),即使用共享來(lái)減少內(nèi)部形狀的耗費(fèi)和用計(jì)算時(shí)間換取對(duì)外部形狀的存儲(chǔ)。的存儲(chǔ)。 運(yùn)用該方式時(shí),傳輸、查找和計(jì)算外部形狀都會(huì)產(chǎn)生運(yùn)轉(zhuǎn)時(shí)的開(kāi)銷(xiāo),尤運(yùn)用該方式時(shí),傳輸、查找和計(jì)算外部形狀都會(huì)產(chǎn)生運(yùn)轉(zhuǎn)時(shí)的開(kāi)銷(xiāo),尤其當(dāng)其當(dāng)Flyweight對(duì)象原先被存儲(chǔ)為內(nèi)部形狀時(shí),開(kāi)銷(xiāo)會(huì)更大。對(duì)象原先被存儲(chǔ)為內(nèi)部形狀時(shí),開(kāi)銷(xiāo)會(huì)更大。 Proxy方式方式Proxy 方式中要?jiǎng)?chuàng)建方式中要?jiǎng)?chuàng)建“stub或或“surrogate對(duì)象,它們的目的是接受懇求對(duì)象,它們的目的是接受懇求并把懇求轉(zhuǎn)發(fā)到實(shí)踐執(zhí)行任務(wù)的其他對(duì)象。并把懇求轉(zhuǎn)發(fā)到實(shí)踐
45、執(zhí)行任務(wù)的其他對(duì)象。比如遠(yuǎn)程方法調(diào)用比如遠(yuǎn)程方法調(diào)用RMI利用利用Proxy方式,使得在其他方式,使得在其他JVM中執(zhí)行的對(duì)中執(zhí)行的對(duì)象就像本地對(duì)象一樣;象就像本地對(duì)象一樣;Proxy方式在實(shí)踐中經(jīng)常運(yùn)用,比如方式在實(shí)踐中經(jīng)常運(yùn)用,比如Windows系統(tǒng)提供的快捷方法。系統(tǒng)提供的快捷方法。 方式引見(jiàn)方式引見(jiàn) 該方式主要有以下幾種情況:該方式主要有以下幾種情況: 遠(yuǎn)程代理遠(yuǎn)程代理Remote Proxy:在不同的地址空間中提供部分代表。:在不同的地址空間中提供部分代表。 虛代理虛代理Virtual Proxy:根據(jù)需求創(chuàng)建開(kāi)銷(xiāo)很大的對(duì)象。:根據(jù)需求創(chuàng)建開(kāi)銷(xiāo)很大的對(duì)象。 智能指引智能指引Smart
46、 Reference:取代簡(jiǎn)單指針。:取代簡(jiǎn)單指針。 維護(hù)代理維護(hù)代理Protection Proxy:控制對(duì)原始對(duì)象的訪問(wèn)。:控制對(duì)原始對(duì)象的訪問(wèn)。Proxy方式構(gòu)造圖方式構(gòu)造圖代理方式構(gòu)造圖如下: Subject:定義:定義RealSubject和和Proxy的共用接口,這樣就在任何運(yùn)用的共用接口,這樣就在任何運(yùn)用RealSubject的地方都可以運(yùn)用的地方都可以運(yùn)用Proxy。 RealSubject:定義:定義Proxy所代表的實(shí)體。所代表的實(shí)體。 Proxy:保管一個(gè)援用使得代理可以訪問(wèn)實(shí)體。控制對(duì)實(shí)體的存取,并能:保管一個(gè)援用使得代理可以訪問(wèn)實(shí)體??刂茖?duì)實(shí)體的存取,并能夠擔(dān)任創(chuàng)建和
47、刪除它,其他功能依賴(lài)于代理的類(lèi)型。夠擔(dān)任創(chuàng)建和刪除它,其他功能依賴(lài)于代理的類(lèi)型。 Proxy方式例如方式例如abstract interface Subjectabstract public void request();class RealSubject implements Subjectpublic void request()System.out.println(Hello World!);class ProxySubject implements Subject/以真實(shí)角色作為代理角色的屬性以真實(shí)角色作為代理角色的屬性private RealSubject realSubject;
48、public void request() preRequest();if(realSubject = = null) realSubject = new RealSubject( ); realSubject.request( );/此處執(zhí)行真實(shí)對(duì)象的此處執(zhí)行真實(shí)對(duì)象的request( )方法方法postRequest();private void preRequest()System.out.println(代理角色即將調(diào)用真實(shí)對(duì)象的代理角色即將調(diào)用真實(shí)對(duì)象的request()方法方法); private void postRequest()System.out.println(調(diào)用真實(shí)對(duì)
49、象的調(diào)用真實(shí)對(duì)象的request()方法終了方法終了); 客戶(hù)段可經(jīng)過(guò)如下的代碼客戶(hù)段可經(jīng)過(guò)如下的代碼訪問(wèn)真實(shí)對(duì)象的方法訪問(wèn)真實(shí)對(duì)象的方法:Subject sub=new ProxySubject();sub.request(); java動(dòng)態(tài)代理類(lèi)動(dòng)態(tài)代理類(lèi) Static Class getProxyClass (ClassLoader loader, Class interfaces):獲得:獲得一個(gè)代理類(lèi),其中一個(gè)代理類(lèi),其中l(wèi)oader是類(lèi)裝載器,是類(lèi)裝載器,interfaces是真實(shí)類(lèi)所擁有的全部接是真實(shí)類(lèi)所擁有的全部接口的數(shù)組。口的數(shù)組。 java.lang.reflect類(lèi)庫(kù)中提供三個(gè)類(lèi)直接支持代理方式:類(lèi)庫(kù)中提供三個(gè)類(lèi)直接支持代理方式:Proxy,InvocationHandler和和Method。 Proxy類(lèi):該類(lèi)即為動(dòng)態(tài)代理類(lèi)。主要有如下主要方法:類(lèi):該類(lèi)即為動(dòng)態(tài)代理類(lèi)。主要有如下主要方法: Protected Proxy(InvocationHandler h):構(gòu)造函數(shù),用于給內(nèi)部的:構(gòu)造函數(shù),用于給內(nèi)部的h賦值。賦值。 Static Object newProxyInstance(Cla
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 冀教版三年級(jí)下冊(cè)數(shù)學(xué)教學(xué)計(jì)劃(及進(jìn)度表)
- 某住宅項(xiàng)目營(yíng)銷(xiāo)執(zhí)行報(bào)告分析
- 2025年春初中蘇科版八年級(jí)下冊(cè)物理10.4《浮力》說(shuō)課稿
- 2025年黨章黨紀(jì)黨史黨建知識(shí)競(jìng)賽多項(xiàng)選擇題庫(kù)及答案(共200道題)
- 項(xiàng)目工作應(yīng)聘簡(jiǎn)歷模板
- 畢業(yè)生工資調(diào)整通知函
- 軟件開(kāi)發(fā)項(xiàng)目管理工具應(yīng)用指南
- 交通信號(hào)系統(tǒng)方案
- 項(xiàng)目團(tuán)隊(duì)建設(shè)與合作策略溝通會(huì)議紀(jì)要
- 股東合作協(xié)議與權(quán)益分配方案
- 2025年常州機(jī)電職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)參考答案
- 2024年四川大學(xué)華西醫(yī)院招聘考試真題
- 2025年安徽衛(wèi)生健康職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及參考答案1套
- 2025年寧夏工商職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)必考題
- 智慧礦山無(wú)人機(jī)自動(dòng)巡檢解決方案
- 17J008擋土墻(重力式、衡重式、懸臂式)圖示圖集
- 氣體充裝安全培訓(xùn)課件
- 2025年度國(guó)家鐵路局安全技術(shù)中心面向社會(huì)公開(kāi)招聘工作人員5人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 大學(xué)生就業(yè)21問(wèn)知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋西華大學(xué)
- DB3410T 47-2024 綠色金融和普惠金融服務(wù)鄉(xiāng)村振興評(píng)價(jià)體系
- 高二走讀生家長(zhǎng)會(huì)課件
評(píng)論
0/150
提交評(píng)論