




已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
適配器模式 /橋接模式,結構型模式 結構型模式概述 結構型模式簡介 適配器模式 模式動機與定義 模式結構與分析 模式實例與解析 模式效果與應用 模式擴展,橋接模式 模式動機與定義 模式結構與分析 模式實例與解析 模式效果與應用,結構型模式,結構型模式概述 結構型模式(Structural Pattern)描述如何將類或者對象結合在一起形成更大的結構,就像搭積木,可以通過簡單積木的組合形成復雜的、功能更為強大的結構。,結構型模式,結構型模式概述 根據(jù)這一點,結構型模式可以分為類結構型模式和對象結構型模式: 類結構型模式關心類的組合,由多個類可以組合成一個更大的系統(tǒng),在類結構型模式中一般只存在繼承關系和實現(xiàn)關系。 對象結構型模式關心類與對象的組合,通過關聯(lián)關系使得在一個類中定義另一個類的實例對象,然后通過該對象調(diào)用其方法。根據(jù)“合成復用原則”,在系統(tǒng)中盡量使用關聯(lián)關系來替代繼承關系,因此大部分結構型模式都是對象結構型模式。,結構型模式,結構型模式簡介 適配器模式(Adapter) 橋接模式(Bridge) 組合模式(Composite) 裝飾模式(Decorator) 外觀模式(Facade) 享元模式(Flyweight) 代理模式(Proxy),適配器模式,模式動機,適配器模式,模式動機 在軟件開發(fā)中采用類似于電源適配器的設計和編碼技巧被稱為適配器模式。 通常情況下,客戶端可以通過目標類的接口訪問它所提供的服務。有時,現(xiàn)有的類可以滿足客戶類的功能需要,但是它所提供的接口不一定是客戶類所期望的,這可能是因為現(xiàn)有類中方法名與目標類中定義的方法名不一致等原因所導致的。 在這種情況下,現(xiàn)有的接口需要轉(zhuǎn)化為客戶類期望的接口,這樣保證了對現(xiàn)有類的重用。如果不進行這樣的轉(zhuǎn)化,客戶類就不能利用現(xiàn)有類所提供的功能,適配器模式可以完成這樣的轉(zhuǎn)化。,適配器模式,模式動機 在適配器模式中可以定義一個包裝類,包裝不兼容接口的對象,這個包裝類指的就是適配器(Adapter),它所包裝的對象就是適配者(Adaptee),即被適配的類。 適配器提供客戶類需要的接口,適配器的實現(xiàn)就是把客戶類的請求轉(zhuǎn)化為對適配者的相應接口的調(diào)用。也就是說:當客戶類調(diào)用適配器的方法時,在適配器類的內(nèi)部將調(diào)用適配者類的方法,而這個過程對客戶類是透明的,客戶類并不直接訪問適配者類。因此,適配器可以使由于接口不兼容而不能交互的類可以一起工作。這就是適配器模式的模式動機。,適配器模式,模式定義 適配器模式(Adapter Pattern) :將一個接口轉(zhuǎn)換成客戶希望的另一個接口,適配器模式使接口不兼容的那些類可以一起工作,其別名為包裝器(Wrapper)。適配器模式既可以作為類結構型模式,也可以作為對象結構型模式。,適配器模式,模式結構 類適配器,適配器模式,模式結構 對象適配器,適配器模式,模式結構 適配器模式包含如下角色: Target:目標抽象類 Adapter:適配器類 Adaptee:適配者類 Client:客戶類,適配器模式,模式分析 典型的類適配器代碼:,適配器模式,模式分析 典型的對象適配器代碼:,適配器模式,適配器模式實例與解析 實例一:仿生機器人 現(xiàn)需要設計一個可以模擬各種動物行為的機器人,在機器人中定義了一系列方法,如機器人叫喊方法cry()、機器人移動方法move()等。如果希望在不修改已有代碼的基礎上使得機器人能夠像狗一樣叫,像狗一樣跑,使用適配器模式進行系統(tǒng)設計。,適配器模式,適配器模式實例與解析 實例一:仿生機器人,適配器模式,模式優(yōu)缺點 適配器模式的優(yōu)點如下: 將目標類和適配者類解耦,通過引入一個適配器類來重用現(xiàn)有的適配者類,而無需修改原有代碼。 增加了類的透明性和復用性,將具體的實現(xiàn)封裝在適配者類中,對于客戶端類來說是透明的,而且提高了適配者的復用性。 靈活性和擴展性都非常好,通過使用配置文件,可以很方便地更換適配器,也可以在不修改原有代碼的基礎上增加新的適配器類,完全符合“開閉原則”。,適配器模式,模式優(yōu)缺點 類適配器模式還具有如下優(yōu)點: 由于適配器類是適配者類的子類,因此可以在適配器類中置換一些適配者的方法,使得適配器的靈活性更強。 類適配器模式的缺點如下: 對于Java、C#等不支持多重繼承的語言,一次最多只能適配一個適配者類,而且目標抽象類只能為抽象類,不能為具體類,其使用有一定的局限性,不能將一個適配者類和它的子類都適配到目標接口。,適配器模式,模式優(yōu)缺點 對象適配器模式還具有如下優(yōu)點: 一個對象適配器可以把多個不同的適配者適配到同一個目標,也就是說,同一個適配器可以把適配者類和它的子類都適配到目標接口。 對象適配器模式的缺點如下: 與類適配器模式相比,要想置換適配者類的方法就不容易。如果一定要置換掉適配者類的一個或多個方法,就只好先做一個適配者類的子類,將適配者類的方法置換掉,然后再把適配者類的子類當做真正的適配者進行適配,實現(xiàn)過程較為復雜。,適配器模式,模式使用 在以下情況下可以使用適配器模式: 系統(tǒng)需要使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的需要。 想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯(lián)的一些類,包括一些可能在將來引進的類一起工作。,適配器模式,模式應用 (1) Sun公司在1996年公開了Java語言的數(shù)據(jù)庫連接工具JDBC,JDBC使得Java語言程序能夠與數(shù)據(jù)庫連接,并使用SQL語言來查詢和操作數(shù)據(jù)。JDBC給出一個客戶端通用的抽象接口,每一個具體數(shù)據(jù)庫引擎(如SQL Server、Oracle、MySQL等)的JDBC驅(qū)動軟件都是一個介于JDBC接口和數(shù)據(jù)庫引擎接口之間的適配器軟件。抽象的JDBC接口和各個數(shù)據(jù)庫引擎API之間都需要相應的適配器軟件,這就是為各個不同數(shù)據(jù)庫引擎準備的驅(qū)動程序。,適配器模式,模式應用 (2)在Spring AOP框架中,對BeforeAdvice、AfterAdvice、ThrowsAdvice三種通知類型借助適配器模式來實現(xiàn)。,適配器模式,模式擴展 缺省適配器模式(Default Adapter Pattern) 當不需要全部實現(xiàn)接口提供的方法時,可先設計一個抽象類實現(xiàn)接口,并為該接口中每個方法提供一個默認實現(xiàn)(空方法),那么該抽象類的子類可有選擇地覆蓋父類的某些方法來實現(xiàn)需求,它適用于一個接口不想使用其所有的方法的情況。因此也稱為單接口適配器模式。,適配器模式,模式擴展 雙向適配器 在對象適配器的使用過程中,如果在適配器中同時包含對目標類和適配者類的引用,適配者可以通過它調(diào)用目標類中的方法,目標類也可以通過它調(diào)用適配者類中的方法,那么該適配器就是一個雙向適配器。,適配器模式,模式擴展 雙向適配器,適配器模式總結,適配器模式用于將一個接口轉(zhuǎn)換成客戶希望的另一個接口,適配器模式使接口不兼容的那些類可以一起工作,其別名為包裝器。適配器模式既可以作為類結構型模式,也可以作為對象結構型模式。 適配器模式包含四個角色:目標抽象類定義客戶要用的特定領域的接口;適配器類可以調(diào)用另一個接口,作為一個轉(zhuǎn)換器,對適配者和抽象目標類進行適配,它是適配器模式的核心;適配者類是被適配的角色,它定義了一個已經(jīng)存在的接口,這個接口需要適配;在客戶類中針對目標抽象類進行編程,調(diào)用在目標抽象類中定義的業(yè)務方法。 在類適配器模式中,適配器類實現(xiàn)了目標抽象類接口并繼承了適配者類,并在目標抽象類的實現(xiàn)方法中調(diào)用所繼承的適配者類的方法;在對象適配器模式中,適配器類繼承了目標抽象類并定義了一個適配者類的對象實例,在所繼承的目標抽象類方法中調(diào)用適配者類的相應業(yè)務方法。,適配器模式的主要優(yōu)點是將目標類和適配者類解耦,增加了類的透明性和復用性,同時系統(tǒng)的靈活性和擴展性都非常好,更換適配器或者增加新的適配器都非常方便,符合“開閉原則”;類適配器模式的缺點是適配器類在很多編程語言中不能同時適配多個適配者類,對象適配器模式的缺點是很難置換適配者類的方法。 適配器模式適用情況包括:系統(tǒng)需要使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的需要;想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯(lián)的一些類一起工作。,橋接模式,模式動機 將實現(xiàn)抽象部分與實現(xiàn)部分分離,使它們各自可以獨立地變化。,橋接模式,模式動機 設想要繪制一幅圖畫,藍天、白云、綠樹、小鳥,如果畫面尺寸很大,那么用蠟筆繪制就會遇到點麻煩。畢竟細細的蠟筆要涂出一片藍天,是有些麻煩。如果有可能,最好有套大號蠟筆,粗粗的蠟筆很快能涂抹完成。至于色彩嗎,最好每種顏色來支粗的,除了藍天還有綠地呢。這樣,如果一套12種顏色的蠟筆,我們需要兩套24支,同種顏色的一粗一細。這樣你就會想要是再有一套中號蠟筆就更好了,這樣,不多不少總共36支蠟筆。,橋接模式,橋接模式,橋接模式,模式結構,橋接模式,Abstraction:定義抽象類的接口,維護一個指向Implementor類型的指針。 Refined Abstraction:擴充Abstraction定義的接口,改變和修正父類對抽象化的定義。 Implementor:這個角色給出實現(xiàn)化角色的接口,但不給出具體的實現(xiàn)。必須指出的是,這個接口不一定和抽象化角色的接口定義相同,實際上,這兩個接口可以非常不一樣。實現(xiàn)化角色應當只給出底層操作,而抽象化角色應當只給出基于底層操作的更高一層的操作。 Concrete Implementor:這個角色給出實現(xiàn)化角色接口的具體實現(xiàn)。,橋接模式,模式分析 abstract class Abstraction private Implementor imp; /抽象部分包含的實現(xiàn)者 public Implementor Imp set imp = value; get return imp; public abstract void Operation(); ,橋接模式,模式分析 派生抽象化角色 class RefinedAbstraction : Abstraction public override void Operation() Imp.OperationImp(); /調(diào)用實現(xiàn)者的方法實現(xiàn)操作 ,橋接模式,模式分析 實現(xiàn)者角色 abstract class Implementor public abstract void OperationImp(); ,橋接模式,模式分析 具體實現(xiàn)者角色A class ConcreteImplementorA : Implementor public override void OperationImp() Console.WriteLine(“ConcreteImplementAs Operator !“); ,橋接模式,模式分析 具體實現(xiàn)者角色B class ConcreteImplementorB : Implementor public override void OperationImp() Console.WriteLine(“ConcreteImplementBs Operator !“); ,橋接模式,模式實用性 如果一個系統(tǒng)需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態(tài)的聯(lián)系。 設計要求實現(xiàn)化角色的任何改變不應當影響客戶端,或者說實現(xiàn)化角色的改變對客戶端是完全透明的。 一個構件有多于一個的抽象化角色和實現(xiàn)化角色,系統(tǒng)需要它們之間進行動態(tài)耦合。 雖然在系統(tǒng)中使用繼承是沒有問題的,但是由于抽象化角色和具體化角色需要獨立變化,設計要求需要獨立管理這兩者。,橋接模式,模式應用 開關與臺燈:任何臺燈都包括燈泡和燈架兩部分,不同的燈泡可以與不同的臺燈(燈架)匹配,可以只更換燈泡或只更換臺燈(燈架),燈泡與臺燈(燈架)之間存在一種交錯的巨烈變化,所以把燈和臺燈“做死”在一起不是一種好的作法??梢允褂脴蚪悠髂J绞怪怦睿涸谂_燈(燈架)上做一個燈口,可以用它來調(diào)用燈泡的“發(fā)光”的方法點亮燈泡,同時我們可以隨意地更換我們喜歡的燈泡,而不用去換整個臺燈(燈架)。,橋接模式,為了實現(xiàn)燈架與燈泡之間的解耦,我們使用橋接器模式,抽象出一個“抽象化臺燈”,它有一個開關一個燈泡,可以通過開關調(diào)用燈泡的發(fā)光方法來實現(xiàn)發(fā)光。同時我們也為燈泡做了一個抽象,以使此燈的燈泡可以恰好安裝在燈架的燈口上。 下面為抽象出來的燈架和燈泡派生兩個燈泡和兩個燈架: 兩個臺燈的燈架:一個是旋鈕式開關,另一個是按鈕式開關。 兩個燈泡:紅色燈泡和藍色燈泡。,橋接模式,抽象臺燈 abstract class Lamp protected Light light; /臺燈上的燈泡 public Light Light set light = value; public abstract void OpenLight(); /臺燈的開關 ,橋接模式,旋鈕臺燈 class CircleLamp: Lamp private int v=0; /旋鈕臺燈打開后,燈泡的最初電壓 public override void OpenLight() /旋轉(zhuǎn)臺燈開關調(diào)亮燈泡 for (v = 0; v = 5; v+) light.Level = v; /根據(jù)電壓設定燈泡發(fā)光強度 light.Shine(); /燈泡發(fā)光 ,橋接模式,按鈕臺燈 class SwitchLamp : Lamp private int v = 5; /打開臺燈開關后,燈泡的最初電壓 public override void OpenLight() /打開按鈕臺燈的開關 light.Level = v; /根據(jù)電壓設定燈泡發(fā)光強度 light.Shine();/燈泡發(fā)光 ,橋接模式,燈泡抽象體 abstract class Light protected int level; /燈泡的發(fā)光強度 public int Level set level = value; public abstract void Shine(); /燈泡的發(fā)光方法 ,橋接模式,紅燈 class RedLight:Ligh
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年元宇宙社交平臺虛擬社交游戲化體驗優(yōu)化與發(fā)展報告
- 2025年醫(yī)院信息化建設初步設計評估關注醫(yī)院信息互聯(lián)互通報告
- 工業(yè)互聯(lián)網(wǎng)平臺網(wǎng)絡安全態(tài)勢感知技術安全監(jiān)測與預警2025年實踐報告
- 2025年醫(yī)藥市場風險預警:仿制藥一致性評價政策影響分析報告001
- 2025年城市生活垃圾分類處理公眾參與行為分析及長效機制研究報告001
- 綠色建筑材料市場推廣策略與政策支持下的綠色金融產(chǎn)品創(chuàng)新報告
- 民辦教育機構合規(guī)運營與品牌形象塑造策略2025年實戰(zhàn)案例研究報告
- 安全與生活試題及答案
- 數(shù)字藝術作品創(chuàng)作與版權保護市場調(diào)研報告
- 安全環(huán)保知識試題及答案
- 2023年公司商業(yè)機密保密管理
- 《古生物學》講義
- 山東農(nóng)業(yè)大學工程造價與招投標(專升本)期末考試復習題
- 2023山西焦煤集團有限責任公司井下操作工招聘2000人筆試模擬試題及答案解析
- 中國西部國際汽車城可行性研究報告(上)
- 通信工程施工組織方案
- 火災報警系統(tǒng)操作及維護保養(yǎng)規(guī)程(保得威爾)
- 靜脈輸液工具合理選擇
- GB/T 9634.2-2002鐵氧體磁心表面缺陷極限導則第2部分:RM磁心
- GB/T 3462-2007鉬條和鉬板坯
- 骨髓抑制管理
評論
0/150
提交評論