C# 設(shè)計(jì)模式系列教程-適配器模式
1. 概述
將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以在一起工作。
2. 解決的問題
即Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以在一起工作。
3. 模式中的角色
3.1 目標(biāo)接口(Target):客戶所期待的接口。目標(biāo)可以是具體的或抽象的類,也可以是接口。
3.2 需要適配的類(Adaptee):需要適配的類或適配者類。
3.3 適配器(Adapter):通過包裝一個(gè)需要適配的對(duì)象,把原接口轉(zhuǎn)換成目標(biāo)接口。
4. 模式解讀
注:在GoF的設(shè)計(jì)模式中,對(duì)適配器模式講了兩種類型,類適配器模式和對(duì)象適配器模式。由于類適配器模式通過多重繼承對(duì)一個(gè)接口與另一個(gè)接口進(jìn)行匹配,而C#、java等語言都不支持多重繼承,因而這里只是介紹對(duì)象適配器。
4.1 適配器模式的類圖

4.2 適配器模式的代碼實(shí)現(xiàn)
/// <summary>
/// 定義客戶端期待的接口
/// </summary>
public class Target
{
/// <summary>
/// 使用virtual修飾以便子類可以重寫
/// </summary>
public virtual void Request()
{
Console.WriteLine("This is a common request");
}
}
/// <summary>
/// 定義需要適配的類
/// </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>
/// 通過重寫,表面上調(diào)用Request()方法,變成了實(shí)際調(diào)用SpecificRequest()
/// </summary>
public override void Request()
{
adaptee.SpecificRequest();
}
}
4.3 客戶端代碼
class Program
{
static void Main(string[] args)
{
// 對(duì)客戶端來說,調(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 通過適配器,客戶端可以調(diào)用同一接口,因而對(duì)客戶端來說是透明的。這樣做更簡(jiǎn)單、更直接、更緊湊。
5.1.2 復(fù)用了現(xiàn)存的類,解決了現(xiàn)存類和復(fù)用環(huán)境要求不一致的問題。
5.1.3 將目標(biāo)類和適配者類解耦,通過引入一個(gè)適配器類重用現(xiàn)有的適配者類,而無需修改原有代碼。
5.1.4 一個(gè)對(duì)象適配器可以把多個(gè)不同的適配者類適配到同一個(gè)目標(biāo),也就是說,同一個(gè)適配器可以把適配者類和它的子類都適配到目標(biāo)接口。
5.2 缺點(diǎn)
對(duì)于對(duì)象適配器來說,更換適配器的實(shí)現(xiàn)過程比較復(fù)雜。
5.3 適用場(chǎng)景
5.3.1 系統(tǒng)需要使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的接口。
5.3.2 想要建立一個(gè)可以重用的類,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類,包括一些可能在將來引進(jìn)的類一起工作。
5.3.3 兩個(gè)類所做的事情相同或相似,但是具有不同接口的時(shí)候。
5.3.4 舊的系統(tǒng)開發(fā)的類已經(jīng)實(shí)現(xiàn)了一些功能,但是客戶端卻只能以另外接口的形式訪問,但我們不希望手動(dòng)更改原有類的時(shí)候。
5.3.5 使用第三方組件,組件接口定義和自己定義的不同,不希望修改自己的接口,但是要使用第三方組件接口的功能。
6. 適配器應(yīng)用舉例
6.1 使用過ADO.NET的開發(fā)人員應(yīng)該都用過DataAdapter,它就是用作DataSet和數(shù)據(jù)源之間的適配器。DataAdapter通過映射Fill和Update來提供這一適配器。
6.2 手機(jī)電源適配器
以上就是本文的全部?jī)?nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#正則匹配RegexOptions選項(xiàng)的組合使用方法
本文主要簡(jiǎn)單介紹RegexOptions各種選項(xiàng)的作用,并介紹如何組合使用,為初學(xué)者解除一些疑惑。2016-04-04
關(guān)于C#數(shù)強(qiáng)轉(zhuǎn)會(huì)不會(huì)拋出異常詳解
這篇文章主要給大家介紹了關(guān)于C#數(shù)強(qiáng)轉(zhuǎn)會(huì)不會(huì)拋出異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04

