C# 設(shè)計(jì)模式系列教程-適配器模式
1. 概述
將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以在一起工作。
2. 解決的問(wèn)題
即Adapter模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以在一起工作。
3. 模式中的角色
3.1 目標(biāo)接口(Target):客戶(hù)所期待的接口。目標(biāo)可以是具體的或抽象的類(lèi),也可以是接口。
3.2 需要適配的類(lèi)(Adaptee):需要適配的類(lèi)或適配者類(lèi)。
3.3 適配器(Adapter):通過(guò)包裝一個(gè)需要適配的對(duì)象,把原接口轉(zhuǎn)換成目標(biāo)接口。
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>
/// 定義客戶(hù)端期待的接口
/// </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 客戶(hù)端代碼
class Program
{
static void Main(string[] args)
{
// 對(duì)客戶(hù)端來(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ò)適配器,客戶(hù)端可以調(diào)用同一接口,因而對(duì)客戶(hù)端來(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)了一些功能,但是客戶(hù)端卻只能以另外接口的形式訪問(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è)參考,也希望大家多多支持我們。
上一篇:C# 設(shè)計(jì)模式系列教程-狀態(tài)模式
欄 目:C#教程
下一篇:C# 設(shè)計(jì)模式系列教程-觀察者模式
本文標(biāo)題:C# 設(shè)計(jì)模式系列教程-適配器模式
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6488.html
您可能感興趣的文章
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10TortoiseSVN使用教程
- 01-10C#編程中枚舉類(lèi)型的使用教程
- 01-10Python設(shè)計(jì)模式編程中的備忘錄模式與對(duì)象池模式示例
- 01-10C#中的delegate委托類(lèi)型基本學(xué)習(xí)教程
- 01-10dotNet中的反射用法入門(mén)教程
- 01-10詳解C#的設(shè)計(jì)模式編程之抽象工廠模式的應(yīng)用
- 01-10解析C#設(shè)計(jì)模式編程中的裝飾者模式
- 01-10簡(jiǎn)單了解C#設(shè)計(jì)模式編程中的橋接模式
- 01-10C#編程中使用設(shè)計(jì)模式中的原型模式的實(shí)例講解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改


