




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第三章結構型模式1課程目標 結構型模式概述 Adapter模式 Bridge模式 Composite模式 Decorator模式 Faade模式 Flyweight模式 Proxy模式 2體驗項目 使用Composite模式來編寫如圖3-1所示的二叉樹,然后使用深度優(yōu)先搜索法遍歷該二叉樹,并打印出根節(jié)點的高度,運行效果如圖3-2所示。 圖3-1二叉樹圖 圖3-2 二叉樹遍歷結果圖3結構型模式概述 結構型模式是為解決怎樣組裝現(xiàn)有的類,設計他們的交互方式,從而達到實現(xiàn)一定的功能的目的。同時,結構型模式包容了對很多問題的解決,例如擴展性(外觀模式,組成模式,代理模式,裝飾模式),封裝性(適配器模式,
2、橋接模式)。 結構型模式中解決了以下幾個問題:在不破壞類封裝性的基礎上,實現(xiàn)新的功能。這一點包括裝飾模式,代理模式。 在不破壞類封裝性的基礎上,使得類可以同不曾估計到的系統(tǒng)進行交互。這一點包括橋接和適配器模式。 創(chuàng)建一組類的統(tǒng)一訪問接口,這是組成模式。 對同一類創(chuàng)建不同的訪問界面,提供給不同需要的訪問者,這是外觀模式。 4Adapter模式 適配器模式有類適配器和對象匹配器兩種形式。其中類適配器使用多繼承(由于java不支持多繼承,所以可以引入接口的概念)來實現(xiàn)一個接口對另一個接口的匹配,對象適配器主要依賴于對象組合來實現(xiàn)接口的匹配。比如java窗體事件處理的事件適配器就是一個很好的例子。 模
3、式介紹 主要適用于以下情況: 使用一個已經(jīng)存在的類,而它的接口不符合你的需求。 創(chuàng)建一個可以復用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協(xié)同工作。 使用一些已經(jīng)存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口,僅適用于對象適配器。 5Adapter模式結構圖適配器模式結構圖如下: 類適配器結構圖 對象適配器結構圖 Target:定義Client使用的與特定應用或領域相關的接口。 Adaptee:定義一個已經(jīng)存在的類,該類需要適配。 Adapter:對Adaptee類和Target接口進行適配。Client通過Adap
4、ter實例對象來調用某些方法,然后適配器調用Adaptee的方法來實現(xiàn)請求6適配器模式示例比如我們編寫過兩個類,分別用于畫圓形樁和方形樁,假設現(xiàn)在有一個應用,需要既畫方形樁,又要畫圓形樁,就可以使用該模式實現(xiàn)。 使用對象適配器 模式實現(xiàn)如下:public class DrawRoundpublic void displayRound(String msg)System.out.println(DrawRound displayRound():+msg);public class DrawSquarepublic void displaySquare(String str)System.out.
5、println(DrawSquare displaySquare():+str); public class ShapeAdapter extends DrawSquareprivate DrawRound round;public ShapeAdapter(DrawRound r)this.round=r;public void insertRound(String str)round.displayRound(str);7使用類適配器 模式實現(xiàn)如下:public interface DrawRoundInterfacepublic void displayRound(String msg)
6、;public class DrawRound implements DrawRoundInterface public void displayRound(String msg)System.out.println(DrawRound displayRound():+msg);public class ShapeAdapter extends DrawSquare implements DrawRoundInterfaceprivate DrawRound round;public ShapeAdapter(DrawRound r)this.round=r;public void displ
7、ayRound(String msg)round.displayRound(msg);/doSomethingpublic class Client public static void main(String args) ShapeAdapter d=new ShapeAdapter(new DrawRound();d.insertRound(圓形);d.displaySquare(方形);8Adapter模式優(yōu)勢和不足 類適配器的優(yōu)缺點如下 :用一個具體的Adapter類對Adaptee和Target進行匹配。結果是當我們想要匹配一個類以及所有它的子類時,類Adapter將不能勝任工作。
8、使得Adapter可以重定義Adaptee的部分行為。對象適配器的優(yōu)缺點如下:允許一個Adapter與多個Adaptee,即Adaptee本身以及它的所有子類(如果有子類的話)同時工作。 使得重定義Adaptee的行為比較困難。 僅僅引入了一個對象,并不需要額外的引用(指針)以間接得到Adaptee。 9Bridge模式在面向對象設計的基本概念中,對象這個概念實際上是由屬性和行為兩個部分組成的,屬性我們可以認為是一種靜止的,一種抽象的。一般情況下,行為是包含在一個對象中,但是在有些情況下,我們需要將這些行為也進行歸類,形成一個總的行為接口,這就是橋接模式的用處。模式介紹 主要適用于以下情況:
9、不希望在抽象和它的實現(xiàn)部分之間有一個固定的綁定關系。類的抽象以及它的實現(xiàn)都應該可以通過生成子類的方法加以擴充。 在多個對象間共享實現(xiàn)(可能使用引用計數(shù)),但同時要求客戶并不知道這一點。 10Bridge模式結構圖橋接模式結構圖如下: Abstraction:定義抽象類(接口),并維護一個Implementor類型對象。 RefinedAbstraction:抽象類的具體實現(xiàn)。 Implementor:實現(xiàn)層的抽象父類(接口),提供基本操作,以供抽象層次的類調用。ConcreteImplementor:Implementor的具體實現(xiàn)。 11Bridge模式示例public abstract c
10、lass 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();public class StudentInforLis
11、t extends InforListpublic void distributeInforList( )System.out.println(這是學生信息單);InforlistFormat format=this.getFormat();format.formatImpl();public class TeacherInforList extends InforListpublic void distributeInforList()System.out.println(這是老師信息單);InforlistFormat format=this.getFormat();format.form
12、atImpl();public class HtmlFormat extends InforlistFormatpublic void formatImpl()System.out.println(使用HTML格式生成);public class PlainTextFormat extends InforlistFormatpublic void formatImpl()System.out.println(使用純文本格式生成);12Bridge模式優(yōu)勢和不足 不足:Bridge模式的應用一般用于“兩個非常強的變化維度”,有時即使有兩個變化的維度,但是某個方向的變化維度并不劇烈,換言之兩個變化
13、不會導致縱橫交錯的結果,并沒必要使用Bridge模式。 分離抽象部分及其實現(xiàn)部分。 提高可擴充性??梢元毩⒌膶Τ橄蟛糠趾蛯崿F(xiàn)部分進行擴充。 Bridge模式是比多繼承方案更好的一種解決方法。 Bridge模式主要有以下一些優(yōu)點: 向客戶隱藏了實現(xiàn)部分,從而當需要擴展/更改實現(xiàn)部分時,不需要重新編譯客戶代碼。 13 Composite模式 Composite模式即合成模式,將對象組織到樹結構中,可以用來描述整體與部分的關系。合成模式可以使客戶端將簡單元素與復合元素同等看待。如文件夾與文件就是合成模式的典型應用。 模式介紹 主要適用于以下情況: 需要表示對象的部分和整體的層次結構。 希望用戶忽略組
14、合對象與單個對象的區(qū)別,用戶將統(tǒng)一使用組合結構中的所有對象。 14 Composite模式結構圖合成模式結構圖如下: Component:為組合中的對象聲明接口,定義所有類共有接口的缺省行為。 Leaf:表示葉子節(jié)點,葉子節(jié)點沒有子節(jié)點。 Composite:所有可以包含子節(jié)點的類都擴展這個類。這個類的主要功能是用來存儲子部件,實現(xiàn)了接口中的方法。Client:通過接口操縱組合部件的對象。 15Composite模式示例public abstract class Computer protected String name;public Computer(String name) this.n
15、ame = name;public abstract void getPart();import java.util.*;public class ComputerPart extends Computerprotected Vector part = new Vector();public 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=
16、(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 Computer public ChildPart(String name)super(name);public void getPart()System.out.println(name);16Composite模式優(yōu)勢和不足 Composite模式采用樹形結構來實現(xiàn)普遍存在的對象容器,從而將
17、“一對多”的關系轉化為“一對一”的關系, 將“客戶代碼與復雜的對象容器結構”解耦 ,解耦之后,客戶端代碼將與純粹的抽象接口,而非對象容器的復內部實現(xiàn)結構,發(fā)生依賴關系,從而更能“應對變化”。 Composite模式中,是將“Add和Remove等和對象容器相關的方法”定義在“表示抽象對象的Component類”中,還是將其定義在“表示對象容器的Composite類”中,是一個關乎“透明性”和“安全性”的兩難問題,需要仔細權衡。這里有可能違背面向對象的“單一職責原則”,但是對于這種特殊結構,這又是必須付出的代價。 Bridge模式優(yōu)點和不足: Composite模式在具體實現(xiàn)中,可以讓父對象中的
18、子對象反向追溯 17Decorator模式 Decorator模式即裝飾模式,是指動態(tài)的給一個對象添加一些額外的職責,在Java 的IO操作中,經(jīng)常會用到諸如如下的語句: 模式介紹 主要適用于以下情況: 在不影響其他對象的情況下,以動態(tài)、透明的方式給單個對象添加方法?;蛘咛幚砟切┛梢猿废姆椒?。 當不能采用生成子類的方式進行擴充時。BufferedReader br = new BufferedReader(new InputStreamReader(new (new File(D:a.txt);while(br.readLine()!=null)System.out.println(br.r
19、eadLine();在該代碼中使用多個的Decorator被層疊在一起,最后得到一個功能強大的流。既能夠被緩沖,又能夠得到行數(shù), 18Decorator模式結構圖裝飾模式結構圖如下: Component:定義一個對象接口,以規(guī)范準備接收附加責任的對象。 ConcreteComponent:定義一個將要接收附加責任的類。 Decorator:持有一個組件對象的實例,并定義一個與抽象組件接口一致的接口。 ConcreteDecorator:負責給組件對象“貼上”附加的責任。19Decorator模式示例public interface Phone public void use();public
20、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( ); public class AutoDecorator extends Decorator public AutoDecorator(Phone phone)super(phone
21、);public void use( )phone.use( );System.out.println(裝配自動回復功能);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.us
22、e();/添加自動回復功能Phone p1=new Decorator(new AutoDecorator(p);p1.use( );/添加自動回復功能和可視功能Phone p2=new Decorator(new WatchDecorator(new AutoDecorator(p);p2.use();20Decorator模式優(yōu)勢和不足 Decorator模式主要有以下幾點優(yōu)勢:比靜態(tài)繼承更靈活。 避免了在層次結構中高層的類有太多的特性。Decorator模式提供了一種“即用即付”的方法來添加職責。 Decorator模式的不足之處主要在于有太多的小對象。采用Decorator模式進行設計
23、往往會產(chǎn)生許多看上去類似的小對象,這些對象僅僅在它們相互連接的方式上有所不同,所以在排錯時會很困難。 Decorator模式不足21Facade模式 Facade模式(外觀模式)的意圖是:為子系統(tǒng)中的一組接口提供一致的界面,F(xiàn)acade模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。 模式介紹 主要適用于以下情況: 當要為一個復雜子系統(tǒng)提供一個簡單接口時。 客戶程序與抽象類的實現(xiàn)部分之間存在著很大的依賴性。 當需要構建一個層次結構的子系統(tǒng)時,使用Facade模式定義子系統(tǒng)中每層的入口點。 22Facade模式結構圖外觀模式結構圖如下: Facade:知道哪些子系統(tǒng)類負責處理請求,將
24、客戶的請求代理給適當?shù)淖酉到y(tǒng)對象。 子系統(tǒng)類(Subsystem classes):實現(xiàn)子系統(tǒng)的功能,處理由Facade對象指派的任務。 23Facade模式示例import java.sql.*;public class Client public static void main(String args) DBConnection b=new DBConnection();b.setDriver(com.microsoft.jdbc.sqlserver.SQLServerDriver);b.setServername(lacalhost);b.setDBname(pubs);tryConn
25、ection 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 String driver,servername,dbname;public void setDriver(String driver) this.driver=driver; public void set
26、Servername(String servername)this.servername= servername;public void setDBname(String dbname) this.dbname= dbname; public Connection connect() try Class.forName(driver);Connection cn = DriverManager.getConnection(jdbc:microsoft:sqlserver:/“+ servername+:1433;databasename=+dbname, sa, );System.out.pr
27、intln(信息提示:連接 +servername + 服務器 + dbname +數(shù)據(jù)庫已成功!);return cn; catch (Exception e) System.out.println(信息提示:連接 + servername + 服務器+ dbname +失?。 + e);return null;24Facade模式優(yōu)勢和不足 Facade模式主要有以下幾點優(yōu)勢:對客戶屏蔽子系統(tǒng)組件,因而減少了客戶處理的對象的數(shù)目,使得子系統(tǒng)使用起來更加方便。 實現(xiàn)了子系統(tǒng)與客戶間的松耦合關系。松耦合關系使得子系統(tǒng)的組件變化不會影響到客戶端。 Facade模式不足Facade模式的缺點主要
28、在于使用Facade模式時,要定義interface是很麻煩的一件事情,特別是在內部類所能提供的方法還沒確定或外部所需功能還沒確定的時候尤為如此。 25 Flyweight模式 Flyweight模式即享元模式,該模式的意圖是避免大量擁有相同內容的小類的開銷(如耗費內存),使大家共享一個類(元類)。享元模式以共享的方式高效的支持大量的細粒度對象。享元模式能做到共享的關鍵是區(qū)分內部狀態(tài)和外部狀態(tài)。Flyweight模式是一個提高程序效率和性能的模式,會大大加快程序的運行速度。應用場合很多,比如你要從一個數(shù)據(jù)庫中讀取一系列字符串,這些字符串中有許多是重復的,那么我們可以將這些字符串儲存在Flywe
29、ight池(pool)中。 模式介紹 當以下情況都成立時使用Flyweight模式: 一個應用程序使用了大量的對象。 由于使用了大量的對象,造成很大的開銷。 如果刪除對象的外部狀態(tài),就可以使用相對較少的共享對象來取代很多組對象。 應用程序不依賴于對象標識。 26Flyweight模式結構圖享元模式結構圖如下: Flyweight:描述一個接口,通過這個接口Flyweight示例對象可接受并作用于外部狀態(tài)。 UnsharedConcreteFlyweight:并非所有的Flyweight子類都需要被共享, UnsharedConcreteFlyweight對象通常將ConcreteFlyweig
30、ht對象作為子節(jié)點。 FlyweightFactory:創(chuàng)建并管理Flyweight對象,確保合理的共享Flyweight 。ConcreteFlyweight:實現(xiàn)Flyweight接口,并為內部狀態(tài)添加存儲空間。 27Flyweight模式示例public interface Flyweightpublic abstract void operation();public class ConcreteFlyweight implements Flyweightprivate String string;public ConcreteFlyweight(String str) string
31、= str;public void operation()System.out.println(Concrete-Flyweight : + string);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)
32、 /產(chǎn)生新的ConcreteFlyweightflyweight = new ConcreteFlyweight(obj.toString();flyweights.put(obj, flyweight);return flyweight;public int getFlyweightSize()return flyweights.size();FlyweightFactory對象提供了一個已創(chuàng)建的實例,如果該實例沒有,F(xiàn)lyweightFactory對象就創(chuàng)建一個。 28Flyweight模式優(yōu)勢和不足 Flyweight模式優(yōu)勢:Flyweight模式不足:Flyweight模式主要是對存
33、儲的節(jié)約,共享的Flyweight越多,存儲節(jié)約也就越多,節(jié)約量隨著共享狀態(tài)的增多而增大。可以使用兩種方法來節(jié)約存儲,即使用共享來減少內部狀態(tài)的消耗和用計算時間換取對外部狀態(tài)的存儲。 使用該模式時,傳輸、查找和計算外部狀態(tài)都會產(chǎn)生運行時的開銷,尤其當Flyweight對象原先被存儲為內部狀態(tài)時,開銷會更大。 29Proxy模式Proxy 模式中要創(chuàng)建“stub”或“surrogate”對象,它們的目的是接受請求并把請求轉發(fā)到實際執(zhí)行工作的其他對象。比如遠程方法調用(RMI)利用Proxy模式,使得在其他JVM中執(zhí)行的對象就像本地對象一樣;Proxy模式在實際中經(jīng)常應用,比如Windows系統(tǒng)提
34、供的快捷方法。 模式介紹 該模式主要有以下幾種情況: 遠程代理(Remote Proxy):在不同的地址空間中提供局部代表。 虛代理(Virtual Proxy):根據(jù)需要創(chuàng)建開銷很大的對象。 智能指引(Smart Reference):取代簡單指針。 保護代理(Protection Proxy):控制對原始對象的訪問。30Proxy模式結構圖代理模式結構圖如下: Subject:定義RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy。 RealSubject:定義Proxy所代表的實體。 Proxy:保存一個引用使得代理可以訪問實體
35、。控制對實體的存取,并可能負責創(chuàng)建和刪除它,其他功能依賴于代理的類型。 31Proxy模式示例abstract interface Subjectabstract public void request();class RealSubject implements Subjectpublic void request()System.out.println(Hello World!);class ProxySubject implements Subject/以真實角色作為代理角色的屬性private RealSubject realSubject; public void request()
36、 preRequest();if(realSubject = = null) realSubject = new RealSubject( ); realSubject.request( );/此處執(zhí)行真實對象的request( )方法postRequest();private void preRequest()System.out.println(代理角色即將調用真實對象的request()方法); private void postRequest()System.out.println(調用真實對象的request()方法結束); 客戶段可通過如下的代碼訪問真實對象的方法:Subject
37、sub=new ProxySubject();sub.request(); 32java動態(tài)代理類 Static Class getProxyClass (ClassLoader loader, Class interfaces):獲得一個代理類,其中l(wèi)oader是類裝載器,interfaces是真實類所擁有的全部接口的數(shù)組。 java.lang.reflect類庫中提供三個類直接支持代理模式:Proxy,InvocationHandler和Method。 Proxy類:該類即為動態(tài)代理類。主要有如下主要方法: Protected Proxy(InvocationHandler h):構造函數(shù),用于給內部的h賦值。 Static Object newProxyInstance(ClassLoader loader, Class interfaces, InvocationHandler h):返回代理類的一個實例。 InvocationHandler接口:該接口中僅定義了一個方法Object invoke(Object obj,Method method,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年藥理學考試模擬測試的試題及答案
- 二手車銷售技巧與評估的關系考題試題及答案
- 如何選擇美容師培訓機構及試題及答案
- 2024年美容師實操考試的常見題型試題及答案
- 臨床藥理學考試試題及答案
- 新零售項目培訓
- 汽車美容師項目管理與資源配置的有效性考核試題及答案
- 碳筆寫字考試題目及答案
- 公務員省考考生的汽車維修工素質提升計劃試題及答案
- 2024年計算機基礎考試復習指南試題及答案
- MH-T 4019-2012民用航空圖編繪規(guī)范
- 《中國潰瘍性結腸炎診治指南(2023年)》解讀
- 宮頸病變規(guī)范化治療流程
- 貸款審批通知書
- 國家電網(wǎng)智能化規(guī)劃總報告
- 鋼筋優(yōu)化技術創(chuàng)效手冊(2022年)
- 基于微信小程序的音樂播放的設計與實現(xiàn)
- 宣傳冊設計教學課件
- 授權查檔的授權委托書
- 【基于Java的水果商城購物系統(tǒng)設計與實現(xiàn)10000字(論文)】
- 置業(yè)顧問銷售逼單技巧培訓
評論
0/150
提交評論