天天看點

設計模式之結構型模式結構型模式

結構型模式

一、擴充卡模式

(一)定義:擴充卡模式(Adapter Pattern)是作為兩個不相容的接口之間的橋梁,它結合了兩個獨立接口的功能。這種模式涉及到一個單一的類,該類負責加入獨立的或不相容的接口功能。

(二)模式說明:

在現實生活中,經常出現兩個對象因接口不相容而不能在一起工作的執行個體,這時需要第三者進行适配。例如,講中文的人同講英文的人對話時需要一個翻譯,用直流電的筆記本電腦接交流電源時需要一個電源擴充卡,用計算機通路照相機的 SD 記憶體卡時需要一個讀卡器等。

在軟體設計中也可能出現:需要開發的具有某種業務功能的元件在現有的元件庫中已經存在,但它們與目前系統的接口規範不相容,如果重新開發這些元件成本又很高,這時用擴充卡模式能很好地解決這些問題。

(三)構成要素:

設計模式之結構型模式結構型模式

(四)應用案例

用擴充卡模式(Adapter)模拟新能源汽車的發動機。

分析:新能源汽車的發動機有電能發動機(Electric Motor)和光能發動機(Optical Motor)等,各種發動機的驅動方法不同,例如,電能發動機的驅動方法 electricDrive() 是用電能驅動,而光能發動機的驅動方法 opticalDrive() 是用光能驅動,它們是擴充卡模式中被通路的适配者。

用戶端希望用統一的發動機驅動方法 drive() 通路這兩種發動機,是以必須定義一個統一的目标接口 Motor,然後再定義電能擴充卡(Electric Adapter)和光能擴充卡(Optical Adapter)去适配這兩種發動機。

設計模式之結構型模式結構型模式

二、橋接模式

(一)定義:橋接模式是用于把抽象化與實作化解耦,使得二者可以獨立變化,它通過提供抽象化和實作化之間的橋接結構,來實作二者的解耦。

(二)模式說明:

在現實生活中,某些類具有兩個或多個次元的變化,如圖形既可按形狀分,又可按顔色分。如何設計類似于 Photoshop 這樣的軟體,能畫不同形狀和不同顔色的圖形呢?如果用繼承方式,m 種形狀和 n 種顔色的圖形就有 m×n 種,不但對應的子類很多,而且擴充困難。

當然,這樣的例子還有很多,如不同顔色和字型的文字、不同品牌和功率的汽車、不同性别和職業的男女、支援不同平台和不同檔案格式的媒體播放器等。如果用橋接模式就能很好地解決這些問題。

(三)構成要素:

設計模式之結構型模式結構型模式

(四)應用案例

用橋接(Bridge)模式模拟女士皮包的選購。

分析:女士皮包有很多種,可以按用途分、按皮質分、按品牌分、按顔色分、按大小分等,存在多個次元的變化,是以采用橋接模式來實作女士皮包的選購比較合适。

本執行個體按用途分可選錢包(Wallet)和挎包(HandBag),按顔色分可選黃色(Yellow)和紅色(Red)。可以按兩個次元定義為顔色類和包類。

顔色類(Color)是一個次元,定義為實作化角色,它有兩個具體實作化角色:黃色和紅色,通過 getColor() 方法可以選擇顔色;

包類(Bag)是另一個次元,定義為抽象化角色,它有兩個擴充抽象化角色:挎包和錢包,它包含了顔色類對象,通過 getName() 方法可以選擇相關顔色的挎包和錢包。

設計模式之結構型模式結構型模式

三、組合模式

(一)定義:有時又叫作部分-整體模式,它是一種将對象組合成樹狀的層次結構的模式,用來表示“部分-整體”的關系,使使用者對單個對象群組合對象具有一緻的通路性。

(二)模式說明:在現實生活中,存在很多“部分-整體”的關系,例如,大學中的部門與學院、總公司中的部門與分公司、學習用品中的書與書包、生活用品中的衣月艮與衣櫃以及廚房中的鍋碗瓢盆等。在軟體開發中也是這樣,例如,檔案系統中的檔案與檔案夾、窗體程式中的簡單控件與容器控件等。對這些簡單對象與複合對象的處理,如果用組合模式來實作會很友善。

(三)構成要素:

設計模式之結構型模式結構型模式

(四)應用案例

用組合模式實作當使用者在商店購物後,顯示其所選商品資訊,并計算所選商品總價的功能。

說明:假如李先生到韶關“天街e角”生活用品店購物,用 1 個紅色小袋子裝了 2 包婺源特産(單價 7.9 元)、1 張婺源地圖(單價 9.9 元);用 1 個白色小袋子裝了 2 包韶關香藉(單價 68 元)和 3 包韶關紅茶(單價 180 元);用 1 個中袋子裝了前面的紅色小袋子和 1 個景德鎮瓷器(單價 380 元);用 1 個大袋子裝了前面的中袋子、白色小袋子和 1 雙李甯牌運動鞋(單價 198 元)。

最後“大袋子”中的内容有:{1 雙李甯牌運動鞋(單價 198 元)、白色小袋子{2 包韶關香菇(單價 68 元)、3 包韶關紅茶(單價 180 元)}、中袋子{1 個景德鎮瓷器(單價 380 元)、紅色小袋子{2 包婺源特産(單價 7.9 元)、1 張婺源地圖(單價 9.9 元)}}},本執行個體可按安全組合模式設計

設計模式之結構型模式結構型模式

四、裝飾模式

(一)定義:指在不改變現有對象結構的情況下,動态地給該對象增加一些職責(即增加其額外功能)的模式,它屬于對象結構型模式。

(二)模式說明:在現實生活中,常常需要對現有産品增加新的功能或美化其外觀,如房子裝修、相片加相框等。在軟體開發過程中,有時想用一些現存的元件。這些元件可能隻是完成了一些核心功能。但在不改變其結構的情況下,可以動态地擴充其功能。所有這些都可以釆用裝飾模式來實作。

(三)構成要素:

設計模式之結構型模式結構型模式

(四)應用案例

用裝飾模式實作遊戲角色“莫莉卡·安斯蘭”的變身。

分析:在《惡魔戰士》中,遊戲角色“莫莉卡·安斯蘭”的原身是一個可愛少女,但當她變身時,會變成頭頂及背部延伸出蝙蝠狀飛翼的女妖,當然她還可以變為穿着漂亮外衣的少女。這些都可用裝飾模式來實作

設計模式之結構型模式結構型模式

五、代理模式

(一)定義:由于某些原因需要給某對象提供一個代理以控制對該對象的通路。這時,通路對象不适合或者不能直接引用目标對象,代理對象作為通路對象和目标對象之間的中介。

(二)模式說明:在有些情況下,一個客戶不能或者不想直接通路另一個對象,這時需要找一個中介幫忙完成某項任務,這個中介就是代理對象。例如,購買火車票不一定要去火車站買,可以通過 12306 網站或者去火車票代售點買。又如找女朋友、找保姆、找工作等都可以通過找中介完成。

在軟體設計中,使用代理模式的例子也很多,例如,要通路的遠端對象比較大(如視訊或大圖像等),其下載下傳要花很多時間。還有因為安全原因需要屏蔽用戶端直接通路真實對象,如某機關的内部資料庫等。

(三)構成要素:

設計模式之結構型模式結構型模式

(四)與裝飾模式差異:

1、裝飾模式主要是強調對類中代碼的拓展,其内封裝一個可以實作的抽象對象(接口);而代理模式則偏向于委托類的通路限制,其内封裝一個真實對象。

2、代理模式強調的是控制、透明通路,即對真實角色的通路存在限制;裝飾模式強調的是增強、自由建構,着重于對真實角色功能上的拓展。

(五)應用案例:

韶關“天街e角”公司是一家婺源特産公司的代理公司,用代理模式實作。

分析:本執行個體中的“婺源特産公司”經營許多婺源特産,它是真實主題,提供了顯示特産的 display() 方法,而韶關“天街e角”公司是婺源特産公司特産的代理,通過調用婺源特産公司的 display() 方法顯示代理産品,當然它可以增加一些額外的處理,如包裝或加價等。客戶可通過“天街e角”代理公司間接通路“婺源特産公司”的産品

設計模式之結構型模式結構型模式

六、外觀模式

(一)定義:是一種通過為多個複雜的子系統提供一個一緻的接口,而使這些子系統更加容易被通路的模式。

(二)模式說明:在現實生活中,常常存在辦事較複雜的例子,如辦房産證或注冊一家公司,有時要同多個部門聯系,這時要是有一個綜合部門能解決一切手續問題就好了。

軟體設計也是這樣,當一個系統的功能越來越強,子系統會越來越多,客戶對系統的通路也變得越來越複雜。這時如果系統内部發生改變,用戶端也要跟着改變,這違背了“開閉原則”,也違背了“迪米特法則”,是以有必要為多個子系統提供一個統一的接口,進而降低系統的耦合度,這就是外觀模式的目标。

(三)構成要素:

設計模式之結構型模式結構型模式

(四)應用案例:

用“外觀模式”設計一個婺源特産的選購界面。

分析:本執行個體的外觀角色 WySpecialty 是 JPanel 的子類,它擁有 8 個子系統角色 Specialty1~Specialty8,它們是圖示類(ImageIcon)的子類對象,用來儲存該婺源特産的圖示

外觀類(WySpecialty)用 JTree 元件來管理婺源特産的名稱,并定義一個事件處理方法 valueClianged(TreeSelectionEvent e),當使用者從樹中選擇特産時,該特産的圖示對象儲存在标簽(JLabd)對象中。

設計模式之結構型模式結構型模式

七、享元模式

(一)定義:運用共享技術來有效地支援大量細粒度對象的複用。它通過共享已經存在的對象來大幅度減少需要建立的對象數量、避免大量相似類的開銷,進而提高系統資源的使用率。

(二)模式說明:在面向對象程式設計過程中,有時會面臨要建立大量相同或相似對象執行個體的問題。建立那麼多的對象将會耗費很多的系統資源,它是系統性能提高的一個瓶頸。例如,圍棋和五子棋中的黑白棋子,圖像中的坐标點或顔色,區域網路中的路由器、交換機和集線器,教室裡的桌子和凳子等。這些對象有很多相似的地方,如果能把它們相同的部分提取出來共享,則能節省大量的系統資源,這就是享元模式的産生背景。

(三)構成要素:

設計模式之結構型模式結構型模式

(四)應用案例:

享元模式在五子棋遊戲中的應用。

分析:五子棋同圍棋一樣,包含多個“黑”或“白”顔色的棋子,是以用享元模式比較好。

本執行個體中的棋子(ChessPieces)類是抽象享元角色,它包含了一個落子的 DownPieces(Graphics g,Point pt) 方法;白子(WhitePieces)和黑子(BlackPieces)類是具體享元角色,它實作了落子方法;Point 是非享元角色,它指定了落子的位置;WeiqiFactory 是享元工廠角色,它通過 ArrayList 來管理棋子,并且提供了擷取白子或者黑子的 getChessPieces(String type) 方法

設計模式之結構型模式結構型模式

參考:

[1] 軟體設計模式概述

繼續閱讀