C# 設(shè)計(jì)模式系列教程-適配器模式
1. 概述
將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以在一起工作。
2. 解決的問(wèn)題
即Adapter模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以在一起工作。
3. 模式中的角色
3.1 目標(biāo)接口(Target):客戶所期待的接口。目標(biāo)可以是具體的或抽象的類(lèi),也可以是接口。
3.2 需要適配的類(lèi)(Adaptee):需要適配的類(lèi)或適配者類(lèi)。
3.3 適配器(Adapter):通過(guò)包裝一個(gè)需要適配的對(duì)象,把原接口轉(zhuǎn)換成目標(biāo)接口?! ?/p>
4. 模式解讀
注:在GoF的設(shè)計(jì)模式中,對(duì)適配器模式講了兩種類(lèi)型,類(lèi)適配器模式和對(duì)象適配器模式。由于類(lèi)適配器模式通過(guò)多重繼承對(duì)一個(gè)接口與另一個(gè)接口進(jìn)行匹配,而C#、java等語(yǔ)言都不支持多重繼承,因而這里只是介紹對(duì)象適配器。
4.1 適配器模式的類(lèi)圖
4.2 適配器模式的代碼實(shí)現(xiàn)
/// <summary> /// 定義客戶端期待的接口 /// </summary> public class Target { /// <summary> /// 使用virtual修飾以便子類(lèi)可以重寫(xiě) /// </summary> public virtual void Request() { Console.WriteLine("This is a common request"); } } /// <summary> /// 定義需要適配的類(lèi) /// </summary> public class Adaptee { public void SpecificRequest() { Console.WriteLine("This is a special request."); } } /// <summary> /// 定義適配器 /// </summary> public class Adapter:Target { // 建立一個(gè)私有的Adeptee對(duì)象 private Adaptee adaptee = new Adaptee(); /// <summary> /// 通過(guò)重寫(xiě),表面上調(diào)用Request()方法,變成了實(shí)際調(diào)用SpecificRequest() /// </summary> public override void Request() { adaptee.SpecificRequest(); } }
4.3 客戶端代碼
class Program { static void Main(string[] args) { // 對(duì)客戶端來(lái)說(shuō),調(diào)用的就是Target的Request() Target target = new Adapter(); target.Request(); Console.Read(); } }
運(yùn)行結(jié)果
5. 模式總結(jié)
5.1 優(yōu)點(diǎn)
5.1.1 通過(guò)適配器,客戶端可以調(diào)用同一接口,因而對(duì)客戶端來(lái)說(shuō)是透明的。這樣做更簡(jiǎn)單、更直接、更緊湊。
5.1.2 復(fù)用了現(xiàn)存的類(lèi),解決了現(xiàn)存類(lèi)和復(fù)用環(huán)境要求不一致的問(wèn)題。
5.1.3 將目標(biāo)類(lèi)和適配者類(lèi)解耦,通過(guò)引入一個(gè)適配器類(lèi)重用現(xiàn)有的適配者類(lèi),而無(wú)需修改原有代碼。
5.1.4 一個(gè)對(duì)象適配器可以把多個(gè)不同的適配者類(lèi)適配到同一個(gè)目標(biāo),也就是說(shuō),同一個(gè)適配器可以把適配者類(lèi)和它的子類(lèi)都適配到目標(biāo)接口。
5.2 缺點(diǎn)
對(duì)于對(duì)象適配器來(lái)說(shuō),更換適配器的實(shí)現(xiàn)過(guò)程比較復(fù)雜。
5.3 適用場(chǎng)景
5.3.1 系統(tǒng)需要使用現(xiàn)有的類(lèi),而這些類(lèi)的接口不符合系統(tǒng)的接口。
5.3.2 想要建立一個(gè)可以重用的類(lèi),用于與一些彼此之間沒(méi)有太大關(guān)聯(lián)的一些類(lèi),包括一些可能在將來(lái)引進(jìn)的類(lèi)一起工作。
5.3.3 兩個(gè)類(lèi)所做的事情相同或相似,但是具有不同接口的時(shí)候。
5.3.4 舊的系統(tǒng)開(kāi)發(fā)的類(lèi)已經(jīng)實(shí)現(xiàn)了一些功能,但是客戶端卻只能以另外接口的形式訪問(wèn),但我們不希望手動(dòng)更改原有類(lèi)的時(shí)候。
5.3.5 使用第三方組件,組件接口定義和自己定義的不同,不希望修改自己的接口,但是要使用第三方組件接口的功能。
6. 適配器應(yīng)用舉例
6.1 使用過(guò)ADO.NET的開(kāi)發(fā)人員應(yīng)該都用過(guò)DataAdapter,它就是用作DataSet和數(shù)據(jù)源之間的適配器。DataAdapter通過(guò)映射Fill和Update來(lái)提供這一適配器。
6.2 手機(jī)電源適配器
以上就是本文的全部?jī)?nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#在Entity Framework中實(shí)現(xiàn)事務(wù)回滾
這篇文章介紹了C#在Entity Framework中實(shí)現(xiàn)事務(wù)回滾的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08C# 連接SQL數(shù)據(jù)庫(kù)的方法及常用連接字符串
這篇文章主要介紹了C# 連接SQL數(shù)據(jù)庫(kù)的方法及常用連接字符串,有需要的朋友可以參考一下2014-01-01C#微信公眾號(hào)開(kāi)發(fā) 微信事件交互
這篇文章主要介紹了C#微信公眾號(hào)開(kāi)發(fā),微信事件交互的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01通過(guò)C#編寫(xiě)一個(gè)簡(jiǎn)易的Windows截屏增強(qiáng)工具
在使用?Windows?系統(tǒng)的截屏快捷鍵?PrintScreen?截屏?xí)r,如果需要把截屏保存到文件,需要先粘貼到畫(huà)圖工具然后另存為文件。所以本文用C#編寫(xiě)了一個(gè)簡(jiǎn)易的Windows截屏增強(qiáng)工具,需要的可以參考一下2022-05-05C#實(shí)現(xiàn)IP代理池調(diào)度的示例代碼
這篇文章主要為大家介紹了C#實(shí)現(xiàn)IP代理池調(diào)度的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的參考與學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-07-07c# RSA非對(duì)稱(chēng)加解密及XML&PEM格式互換方案
這篇文章主要介紹了c# RSA非對(duì)稱(chēng)加解密及XML&PEM格式互換方案,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2020-12-12C#3.0使用EventLog類(lèi)寫(xiě)Windows事件日志的方法
這篇文章主要介紹了C#3.0使用EventLog類(lèi)寫(xiě)Windows事件日志的方法,以簡(jiǎn)單實(shí)例形式分析了C#寫(xiě)windows事件日志的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08解析C#中斷言與異常的應(yīng)用方式及異常處理的流程控制
這篇文章主要介紹了C#中斷言與異常的應(yīng)用方式及異常處理的流程控制,一般來(lái)說(shuō)斷言用于修正程序員自己的錯(cuò)誤而異常用于應(yīng)對(duì)程序運(yùn)行過(guò)程中可能出現(xiàn)的錯(cuò)誤,需要的朋友可以參考下2016-01-01