結(jié)構(gòu)型模式精品課件_第1頁(yè)
結(jié)構(gòu)型模式精品課件_第2頁(yè)
結(jié)構(gòu)型模式精品課件_第3頁(yè)
結(jié)構(gòu)型模式精品課件_第4頁(yè)
結(jié)構(gòu)型模式精品課件_第5頁(yè)
已閱讀5頁(yè),還剩32頁(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、結(jié)構(gòu)型模式第1頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二課程目標(biāo) 結(jié)構(gòu)型模式概述 Adapter模式 Bridge模式 Composite模式 Decorator模式 Faade模式 Flyweight模式 Proxy模式 第2頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二體驗(yàn)項(xiàng)目 使用Composite模式來(lái)編寫(xiě)如圖3-1所示的二叉樹(shù),然后使用深度優(yōu)先搜索法遍歷該二叉樹(shù),并打印出根節(jié)點(diǎn)的高度,運(yùn)行效果如圖3-2所示。 圖3-1二叉樹(shù)圖 圖3-2 二叉樹(shù)遍歷結(jié)果圖第3頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二結(jié)構(gòu)型模式概述 結(jié)構(gòu)型模式是為解決怎樣組裝

2、現(xiàn)有的類,設(shè)計(jì)他們的交互方式,從而達(dá)到實(shí)現(xiàn)一定的功能的目的。同時(shí),結(jié)構(gòu)型模式包容了對(duì)很多問(wèn)題的解決,例如擴(kuò)展性(外觀模式,組成模式,代理模式,裝飾模式),封裝性(適配器模式,橋接模式)。 結(jié)構(gòu)型模式中解決了以下幾個(gè)問(wèn)題:在不破壞類封裝性的基礎(chǔ)上,實(shí)現(xiàn)新的功能。這一點(diǎn)包括裝飾模式,代理模式。 在不破壞類封裝性的基礎(chǔ)上,使得類可以同不曾估計(jì)到的系統(tǒng)進(jìn)行交互。這一點(diǎn)包括橋接和適配器模式。 創(chuàng)建一組類的統(tǒng)一訪問(wèn)接口,這是組成模式。 對(duì)同一類創(chuàng)建不同的訪問(wèn)界面,提供給不同需要的訪問(wèn)者,這是外觀模式。 第4頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Adapter模式 適配器模式有類適配器和

3、對(duì)象匹配器兩種形式。其中類適配器使用多繼承(由于java不支持多繼承,所以可以引入接口的概念)來(lái)實(shí)現(xiàn)一個(gè)接口對(duì)另一個(gè)接口的匹配,對(duì)象適配器主要依賴于對(duì)象組合來(lái)實(shí)現(xiàn)接口的匹配。比如java窗體事件處理的事件適配器就是一個(gè)很好的例子。 模式介紹 主要適用于以下情況: 使用一個(gè)已經(jīng)存在的類,而它的接口不符合你的需求。 創(chuàng)建一個(gè)可以復(fù)用的類,該類可以與其他不相關(guān)的類或不可預(yù)見(jiàn)的類(即那些接口可能不一定兼容的類)協(xié)同工作。 使用一些已經(jīng)存在的子類,但是不可能對(duì)每一個(gè)都進(jìn)行子類化以匹配它們的接口。對(duì)象適配器可以適配它的父類接口,僅適用于對(duì)象適配器。 第5頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,

4、星期二Adapter模式結(jié)構(gòu)圖適配器模式結(jié)構(gòu)圖如下: 類適配器結(jié)構(gòu)圖 對(duì)象適配器結(jié)構(gòu)圖 Target:定義Client使用的與特定應(yīng)用或領(lǐng)域相關(guān)的接口。 Adaptee:定義一個(gè)已經(jīng)存在的類,該類需要適配。 Adapter:對(duì)Adaptee類和Target接口進(jìn)行適配。Client通過(guò)Adapter實(shí)例對(duì)象來(lái)調(diào)用某些方法,然后適配器調(diào)用Adaptee的方法來(lái)實(shí)現(xiàn)請(qǐng)求第6頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二適配器模式示例比如我們編寫(xiě)過(guò)兩個(gè)類,分別用于畫(huà)圓形樁和方形樁,假設(shè)現(xiàn)在有一個(gè)應(yīng)用,需要既畫(huà)方形樁,又要畫(huà)圓形樁,就可以使用該模式實(shí)現(xiàn)。 使用對(duì)象適配器 模式實(shí)現(xiàn)如下:pu

5、blic class DrawRoundpublic void displayRound(String msg)System.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 ShapeA

6、dapter(DrawRound r)this.round=r;public void insertRound(String str)round.displayRound(str);第7頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二使用類適配器 模式實(shí)現(xiàn)如下:public interface DrawRoundInterfacepublic void displayRound(String msg);public class DrawRound implements DrawRoundInterface public void displayRound(String msg)Sys

7、tem.out.println(DrawRound displayRound():+msg);public class ShapeAdapter extends 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

8、 main(String args) ShapeAdapter d=new ShapeAdapter(new DrawRound();d.insertRound(圓形);d.displaySquare(方形);第8頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Adapter模式優(yōu)勢(shì)和不足 類適配器的優(yōu)缺點(diǎn)如下 :用一個(gè)具體的Adapter類對(duì)Adaptee和Target進(jìn)行匹配。結(jié)果是當(dāng)我們想要匹配一個(gè)類以及所有它的子類時(shí),類Adapter將不能勝任工作。 使得Adapter可以重定義Adaptee的部分行為。對(duì)象適配器的優(yōu)缺點(diǎn)如下:允許一個(gè)Adapter與多個(gè)Adaptee,即A

9、daptee本身以及它的所有子類(如果有子類的話)同時(shí)工作。 使得重定義Adaptee的行為比較困難。 僅僅引入了一個(gè)對(duì)象,并不需要額外的引用(指針)以間接得到Adaptee。 第9頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Bridge模式在面向?qū)ο笤O(shè)計(jì)的基本概念中,對(duì)象這個(gè)概念實(shí)際上是由屬性和行為兩個(gè)部分組成的,屬性我們可以認(rèn)為是一種靜止的,一種抽象的。一般情況下,行為是包含在一個(gè)對(duì)象中,但是在有些情況下,我們需要將這些行為也進(jìn)行歸類,形成一個(gè)總的行為接口,這就是橋接模式的用處。模式介紹 主要適用于以下情況: 不希望在抽象和它的實(shí)現(xiàn)部分之間有一個(gè)固定的綁定關(guān)系。類的抽象以及它

10、的實(shí)現(xiàn)都應(yīng)該可以通過(guò)生成子類的方法加以擴(kuò)充。 在多個(gè)對(duì)象間共享實(shí)現(xiàn)(可能使用引用計(jì)數(shù)),但同時(shí)要求客戶并不知道這一點(diǎn)。 第10頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Bridge模式結(jié)構(gòu)圖橋接模式結(jié)構(gòu)圖如下: Abstraction:定義抽象類(接口),并維護(hù)一個(gè)Implementor類型對(duì)象。 RefinedAbstraction:抽象類的具體實(shí)現(xiàn)。 Implementor:實(shí)現(xiàn)層的抽象父類(接口),提供基本操作,以供抽象層次的類調(diào)用。ConcreteImplementor:Implementor的具體實(shí)現(xiàn)。 第11頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二

11、Bridge模式示例public abstract class InforListInforlistFormat 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();p

12、ublic class StudentInforList extends InforListpublic void distributeInforList( )System.out.println(這是學(xué)生信息單);InforlistFormat format=this.getFormat();format.formatImpl();public class TeacherInforList extends InforListpublic void distributeInforList()System.out.println(這是老師信息單);InforlistFormat format=t

13、his.getFormat();format.formatImpl();public class HtmlFormat extends InforlistFormatpublic void formatImpl()System.out.println(使用HTML格式生成);public class PlainTextFormat extends InforlistFormatpublic void formatImpl()System.out.println(使用純文本格式生成);第12頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Bridge模式優(yōu)勢(shì)和不足 不足:Bridge模

14、式的應(yīng)用一般用于“兩個(gè)非常強(qiáng)的變化維度”,有時(shí)即使有兩個(gè)變化的維度,但是某個(gè)方向的變化維度并不劇烈,換言之兩個(gè)變化不會(huì)導(dǎo)致縱橫交錯(cuò)的結(jié)果,并沒(méi)必要使用Bridge模式。 分離抽象部分及其實(shí)現(xiàn)部分。 提高可擴(kuò)充性??梢元?dú)立的對(duì)抽象部分和實(shí)現(xiàn)部分進(jìn)行擴(kuò)充。 Bridge模式是比多繼承方案更好的一種解決方法。 Bridge模式主要有以下一些優(yōu)點(diǎn): 向客戶隱藏了實(shí)現(xiàn)部分,從而當(dāng)需要擴(kuò)展/更改實(shí)現(xiàn)部分時(shí),不需要重新編譯客戶代碼。 第13頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二 Composite模式 Composite模式即合成模式,將對(duì)象組織到樹(shù)結(jié)構(gòu)中,可以用來(lái)描述整體與部分的關(guān)系。

15、合成模式可以使客戶端將簡(jiǎn)單元素與復(fù)合元素同等看待。如文件夾與文件就是合成模式的典型應(yīng)用。 模式介紹 主要適用于以下情況: 需要表示對(duì)象的部分和整體的層次結(jié)構(gòu)。 希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的區(qū)別,用戶將統(tǒng)一使用組合結(jié)構(gòu)中的所有對(duì)象。 第14頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二 Composite模式結(jié)構(gòu)圖合成模式結(jié)構(gòu)圖如下: Component:為組合中的對(duì)象聲明接口,定義所有類共有接口的缺省行為。 Leaf:表示葉子節(jié)點(diǎn),葉子節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)。 Composite:所有可以包含子節(jié)點(diǎn)的類都擴(kuò)展這個(gè)類。這個(gè)類的主要功能是用來(lái)存儲(chǔ)子部件,實(shí)現(xiàn)了接口中的方法。Client:通

16、過(guò)接口操縱組合部件的對(duì)象。 第15頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二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 Comput

17、erPart(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 ChildPart extends C

18、omputer public ChildPart(String name)super(name);public void getPart()System.out.println(name);第16頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Composite模式優(yōu)勢(shì)和不足 Composite模式采用樹(shù)形結(jié)構(gòu)來(lái)實(shí)現(xiàn)普遍存在的對(duì)象容器,從而將“一對(duì)多”的關(guān)系轉(zhuǎn)化為“一對(duì)一”的關(guān)系, 將“客戶代碼與復(fù)雜的對(duì)象容器結(jié)構(gòu)”解耦 ,解耦之后,客戶端代碼將與純粹的抽象接口,而非對(duì)象容器的復(fù)內(nèi)部實(shí)現(xiàn)結(jié)構(gòu),發(fā)生依賴關(guān)系,從而更能“應(yīng)對(duì)變化”。 Composite模式中,是將“Add和Remove等

19、和對(duì)象容器相關(guān)的方法”定義在“表示抽象對(duì)象的Component類”中,還是將其定義在“表示對(duì)象容器的Composite類”中,是一個(gè)關(guān)乎“透明性”和“安全性”的兩難問(wèn)題,需要仔細(xì)權(quán)衡。這里有可能違背面向?qū)ο蟮摹皢我宦氊?zé)原則”,但是對(duì)于這種特殊結(jié)構(gòu),這又是必須付出的代價(jià)。 Bridge模式優(yōu)點(diǎn)和不足: Composite模式在具體實(shí)現(xiàn)中,可以讓父對(duì)象中的子對(duì)象反向追溯 第17頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Decorator模式 Decorator模式即裝飾模式,是指動(dòng)態(tài)的給一個(gè)對(duì)象添加一些額外的職責(zé),在Java 的IO操作中,經(jīng)常會(huì)用到諸如如下的語(yǔ)句: 模式介紹 主要

20、適用于以下情況: 在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加方法?;蛘咛幚砟切┛梢猿废姆椒ā?當(dāng)不能采用生成子類的方式進(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();在該代碼中使用多個(gè)的Decorator被層疊在一起,最后得到一個(gè)功能強(qiáng)大的流。既能夠被緩沖,又能夠得到行數(shù), 第18頁(yè),共37頁(yè),202

21、2年,5月20日,19點(diǎn)12分,星期二Decorator模式結(jié)構(gòu)圖裝飾模式結(jié)構(gòu)圖如下: Component:定義一個(gè)對(duì)象接口,以規(guī)范準(zhǔn)備接收附加責(zé)任的對(duì)象。 ConcreteComponent:定義一個(gè)將要接收附加責(zé)任的類。 Decorator:持有一個(gè)組件對(duì)象的實(shí)例,并定義一個(gè)與抽象組件接口一致的接口。 ConcreteDecorator:負(fù)責(zé)給組件對(duì)象“貼上”附加的責(zé)任。第19頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Decorator模式示例public interface Phone public void use();public class HomePhone im

22、plements Phonepublic void use() System.out.println(打電話、接電話); public class Decorator implements PhonePhone phone;public Decorator(Phone phone) this.phone=phone; public void use( ) phone.use( ); public class AutoDecorator extends Decorator public AutoDecorator(Phone phone)super(phone);public void use(

23、 )phone.use( );System.out.println(裝配自動(dòng)回復(fù)功能);public class WatchDecorator extends Decorator public WatchDecorator(Phone phone)super(phone);public void use( )phone.use( );System.out.println(裝配可視功能); public class Client public static void main(String args) Phone p=new HomePhone( );p.use();/添加自動(dòng)回復(fù)功能Phone

24、 p1=new Decorator(new AutoDecorator(p);p1.use( );/添加自動(dòng)回復(fù)功能和可視功能Phone p2=new Decorator(new WatchDecorator(new AutoDecorator(p);p2.use();第20頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Decorator模式優(yōu)勢(shì)和不足 Decorator模式主要有以下幾點(diǎn)優(yōu)勢(shì):比靜態(tài)繼承更靈活。 避免了在層次結(jié)構(gòu)中高層的類有太多的特性。Decorator模式提供了一種“即用即付”的方法來(lái)添加職責(zé)。 Decorator模式的不足之處主要在于有太多的小對(duì)象。采用Dec

25、orator模式進(jìn)行設(shè)計(jì)往往會(huì)產(chǎn)生許多看上去類似的小對(duì)象,這些對(duì)象僅僅在它們相互連接的方式上有所不同,所以在排錯(cuò)時(shí)會(huì)很困難。 Decorator模式不足第21頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Facade模式 Facade模式(外觀模式)的意圖是:為子系統(tǒng)中的一組接口提供一致的界面,F(xiàn)acade模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。 模式介紹 主要適用于以下情況: 當(dāng)要為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口時(shí)。 客戶程序與抽象類的實(shí)現(xiàn)部分之間存在著很大的依賴性。 當(dāng)需要構(gòu)建一個(gè)層次結(jié)構(gòu)的子系統(tǒng)時(shí),使用Facade模式定義子系統(tǒng)中每層的入口點(diǎn)。 第22頁(yè),

26、共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Facade模式結(jié)構(gòu)圖外觀模式結(jié)構(gòu)圖如下: Facade:知道哪些子系統(tǒng)類負(fù)責(zé)處理請(qǐng)求,將客戶的請(qǐng)求代理給適當(dāng)?shù)淖酉到y(tǒng)對(duì)象。 子系統(tǒng)類(Subsystem classes):實(shí)現(xiàn)子系統(tǒng)的功能,處理由Facade對(duì)象指派的任務(wù)。 第23頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Facade模式示例import java.sql.*;public class Client public static void main(String args) DBConnection b=new DBConnection();b.setDri

27、ver(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(rs.getString(1);catch(Exception e)System.out.println(e);class DBConnection St

28、ring 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; public Connection connect() try Class.forName(driver);Connection cn = DriverManager

29、.getConnection(jdbc:microsoft:sqlserver:/“+ servername+:1433;databasename=+dbname, sa, );System.out.println(信息提示:連接 +servername + 服務(wù)器 + dbname +數(shù)據(jù)庫(kù)已成功!);return cn; catch (Exception e) System.out.println(信息提示:連接 + servername + 服務(wù)器+ dbname +失?。 + e);return null;第24頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Facade模

30、式優(yōu)勢(shì)和不足 Facade模式主要有以下幾點(diǎn)優(yōu)勢(shì):對(duì)客戶屏蔽子系統(tǒng)組件,因而減少了客戶處理的對(duì)象的數(shù)目,使得子系統(tǒng)使用起來(lái)更加方便。 實(shí)現(xiàn)了子系統(tǒng)與客戶間的松耦合關(guān)系。松耦合關(guān)系使得子系統(tǒng)的組件變化不會(huì)影響到客戶端。 Facade模式不足Facade模式的缺點(diǎn)主要在于使用Facade模式時(shí),要定義interface是很麻煩的一件事情,特別是在內(nèi)部類所能提供的方法還沒(méi)確定或外部所需功能還沒(méi)確定的時(shí)候尤為如此。 第25頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二 Flyweight模式 Flyweight模式即享元模式,該模式的意圖是避免大量擁有相同內(nèi)容的小類的開(kāi)銷(如耗費(fèi)內(nèi)存),使

31、大家共享一個(gè)類(元類)。享元模式以共享的方式高效的支持大量的細(xì)粒度對(duì)象。享元模式能做到共享的關(guān)鍵是區(qū)分內(nèi)部狀態(tài)和外部狀態(tài)。Flyweight模式是一個(gè)提高程序效率和性能的模式,會(huì)大大加快程序的運(yùn)行速度。應(yīng)用場(chǎng)合很多,比如你要從一個(gè)數(shù)據(jù)庫(kù)中讀取一系列字符串,這些字符串中有許多是重復(fù)的,那么我們可以將這些字符串儲(chǔ)存在Flyweight池(pool)中。 模式介紹 當(dāng)以下情況都成立時(shí)使用Flyweight模式: 一個(gè)應(yīng)用程序使用了大量的對(duì)象。 由于使用了大量的對(duì)象,造成很大的開(kāi)銷。 如果刪除對(duì)象的外部狀態(tài),就可以使用相對(duì)較少的共享對(duì)象來(lái)取代很多組對(duì)象。 應(yīng)用程序不依賴于對(duì)象標(biāo)識(shí)。 第26頁(yè),共37頁(yè)

32、,2022年,5月20日,19點(diǎn)12分,星期二Flyweight模式結(jié)構(gòu)圖享元模式結(jié)構(gòu)圖如下: Flyweight:描述一個(gè)接口,通過(guò)這個(gè)接口Flyweight示例對(duì)象可接受并作用于外部狀態(tài)。 UnsharedConcreteFlyweight:并非所有的Flyweight子類都需要被共享, UnsharedConcreteFlyweight對(duì)象通常將ConcreteFlyweight對(duì)象作為子節(jié)點(diǎn)。 FlyweightFactory:創(chuàng)建并管理Flyweight對(duì)象,確保合理的共享Flyweight 。ConcreteFlyweight:實(shí)現(xiàn)Flyweight接口,并為內(nèi)部狀態(tài)添加存儲(chǔ)空間。

33、 第27頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Flyweight模式示例public interface Flyweightpublic 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)

34、;import java.util.Hashtable;public class FlyweightFactoryprivate Hashtable flyweights = new Hashtable();public Flyweight getFlyWeight(Object obj)Flyweight flyweight = (Flyweight) flyweights.get(obj);if (flyweight = = null) /產(chǎn)生新的ConcreteFlyweightflyweight = new ConcreteFlyweight(obj.toString();flywei

35、ghts.put(obj, flyweight);return flyweight;public int getFlyweightSize()return flyweights.size();FlyweightFactory對(duì)象提供了一個(gè)已創(chuàng)建的實(shí)例,如果該實(shí)例沒(méi)有,F(xiàn)lyweightFactory對(duì)象就創(chuàng)建一個(gè)。 第28頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Flyweight模式優(yōu)勢(shì)和不足 Flyweight模式優(yōu)勢(shì):Flyweight模式不足:Flyweight模式主要是對(duì)存儲(chǔ)的節(jié)約,共享的Flyweight越多,存儲(chǔ)節(jié)約也就越多,節(jié)約量隨著共享狀態(tài)的增多而增大。可以使

36、用兩種方法來(lái)節(jié)約存儲(chǔ),即使用共享來(lái)減少內(nèi)部狀態(tài)的消耗和用計(jì)算時(shí)間換取對(duì)外部狀態(tài)的存儲(chǔ)。 使用該模式時(shí),傳輸、查找和計(jì)算外部狀態(tài)都會(huì)產(chǎn)生運(yùn)行時(shí)的開(kāi)銷,尤其當(dāng)Flyweight對(duì)象原先被存儲(chǔ)為內(nèi)部狀態(tài)時(shí),開(kāi)銷會(huì)更大。 第29頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Proxy模式Proxy 模式中要?jiǎng)?chuàng)建“stub”或“surrogate”對(duì)象,它們的目的是接受請(qǐng)求并把請(qǐng)求轉(zhuǎn)發(fā)到實(shí)際執(zhí)行工作的其他對(duì)象。比如遠(yuǎn)程方法調(diào)用(RMI)利用Proxy模式,使得在其他JVM中執(zhí)行的對(duì)象就像本地對(duì)象一樣;Proxy模式在實(shí)際中經(jīng)常應(yīng)用,比如Windows系統(tǒng)提供的快捷方法。 模式介紹 該模式主要

37、有以下幾種情況: 遠(yuǎn)程代理(Remote Proxy):在不同的地址空間中提供局部代表。 虛代理(Virtual Proxy):根據(jù)需要?jiǎng)?chuàng)建開(kāi)銷很大的對(duì)象。 智能指引(Smart Reference):取代簡(jiǎn)單指針。 保護(hù)代理(Protection Proxy):控制對(duì)原始對(duì)象的訪問(wèn)。第30頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Proxy模式結(jié)構(gòu)圖代理模式結(jié)構(gòu)圖如下: Subject:定義RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy。 RealSubject:定義Proxy所代表的實(shí)體。 Proxy:保存一個(gè)

38、引用使得代理可以訪問(wèn)實(shí)體??刂茖?duì)實(shí)體的存取,并可能負(fù)責(zé)創(chuàng)建和刪除它,其他功能依賴于代理的類型。 第31頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二Proxy模式示例abstract interface Subjectabstract public void request();class RealSubject implements Subjectpublic void request()System.out.println(Hello World!);class ProxySubject implements Subject/以真實(shí)角色作為代理角色的屬性private Real

39、Subject realSubject; public void request() preRequest();if(realSubject = = null) realSubject = new RealSubject( ); realSubject.request( );/此處執(zhí)行真實(shí)對(duì)象的request( )方法postRequest();private void preRequest()System.out.println(代理角色即將調(diào)用真實(shí)對(duì)象的request()方法); private void postRequest()System.out.println(調(diào)用真實(shí)對(duì)象的req

40、uest()方法結(jié)束); 客戶段可通過(guò)如下的代碼訪問(wèn)真實(shí)對(duì)象的方法:Subject sub=new ProxySubject();sub.request(); 第32頁(yè),共37頁(yè),2022年,5月20日,19點(diǎn)12分,星期二java動(dòng)態(tài)代理類 Static Class getProxyClass (ClassLoader loader, Class interfaces):獲得一個(gè)代理類,其中l(wèi)oader是類裝載器,interfaces是真實(shí)類所擁有的全部接口的數(shù)組。 類庫(kù)中提供三個(gè)類直接支持代理模式:Proxy,InvocationHandler和Method。 Proxy類:該類即為動(dòng)態(tài)代理類。主要有如下主要方法: Protected Proxy(InvocationHandler h):構(gòu)造函數(shù),用于給內(nèi)部的h賦值。 Static Object newProxyInstance(ClassLoader loader, Class interfaces, InvocationHandler h):返回代理類的一個(gè)實(shí)例。 InvocationHandler接口:該接口中僅定義了一個(gè)方法Object invoke(Object obj,Method method, Object args)。在實(shí)際使用時(shí),第一個(gè)參數(shù)obj一般是指代理類,meth

溫馨提示

  • 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)論