C#學(xué)習(xí)筆記之適配器模式詳解
什么是適配器模式?
適配器模式(Adapter):將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
什么時(shí)候運(yùn)用適配器模式?
在想使用一個(gè)已經(jīng)存在的類時(shí),如果它的接口,也就是它的方法與我們當(dāng)前的要求不相同時(shí),就需要考慮用到適配器模式了。
一般而言,使用適配器模式是出于無奈之舉,一般存在于軟件開發(fā)后期或者維護(hù)期,在軟件設(shè)計(jì)階段,我們還是盡量避免該模式的使用。
適配器模式的組成
Target:目標(biāo)接口,也就是客戶所期待的接口。目標(biāo)可以是具體的或者抽象的類,也可以是接口。
Adpatee:需要適配的類。也就是我們需要與目標(biāo)接口對(duì)接成功的類。
Adapter:中間起到鏈接作用的類。通過在內(nèi)部包裝一個(gè)Adptee對(duì)象,將源接口轉(zhuǎn)換成目標(biāo)接口。
適配器模式具體實(shí)現(xiàn)
適配器模式的結(jié)構(gòu)

適配器模式的實(shí)現(xiàn)
Target類:也就是目標(biāo)類
class Target
{
public virtual void Request()
{
Console.WriteLine("普通請(qǐng)求");
}
}
Adaptee類:需要適配的類
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("特殊請(qǐng)求");
}
}
Adapter類:
class Aapter : Target
{
private Adaptee adaptee = new Adaptee();
/// <summary>
/// 這樣就可以把表面調(diào)用Request()方法變成實(shí)際調(diào)用SpecificRequest()
/// </summary>
public override void Request()
{
adaptee.SpecificRequest();
}
}
主函數(shù)調(diào)用:
static void Main(string[] args)
{
//對(duì)客戶端來說,調(diào)用的是Target的Request()
Target target = new Aapter();
target.Request();
Console.Read();
}
實(shí)例解析
為了深化理解,我們準(zhǔn)備一個(gè)具體的實(shí)例來分析。
姚明作為一個(gè)外籍的球員在進(jìn)入NBA初期,由于英文水平一般,常常聽不懂教練的指揮與安排,需要翻譯來全程跟隨以實(shí)現(xiàn)溝通。請(qǐng)就此來寫出具體的情況。
分析:
在這里,我們不難發(fā)現(xiàn)教練的指揮與安排就是Target,姚明就是Adaptee,而翻譯就理所當(dāng)然成了Adapter,那么我們就能分析出彼此的關(guān)系了。

具體實(shí)現(xiàn):
class Program
{
static void Main(string[] args)
{
Player b = new Forwards("A");
b.Attack();
Player m = new Guards("B");
m.Attack();
//通過翻譯,姚明知道了需要做的事情
Player ym = new Translator("姚明");
ym.Attack();
ym.Defense();
Console.Read();
}
abstract class Player
{
protected string name;
public Player(string name)
{
this.name = name;
}
public abstract void Attack();
public abstract void Defense();
}
/// <summary>
/// 前鋒
/// </summary>
class Forwards : Player
{
public Forwards(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("前鋒{0} 進(jìn)攻", name);
}
public override void Defense()
{
Console.WriteLine("前鋒{0} 防守", name);
}
}
/// <summary>
/// 中鋒
/// </summary>
class Center : Player
{
public Center(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("中鋒{0} 進(jìn)攻", name);
}
public override void Defense()
{
Console.WriteLine("中鋒{0} 防守", name);
}
}
/// <summary>
/// 后衛(wèi)
/// </summary>
class Guards : Player
{
public Guards(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("后衛(wèi){0} 進(jìn)攻", name);
}
public override void Defense()
{
Console.WriteLine("后衛(wèi){0} 防守", name);
}
}
/// <summary>
/// 翻譯是繼承于運(yùn)動(dòng)員的,因?yàn)樗枰苯永斫饨叹毜囊馑?
/// 但是他實(shí)際需要傳達(dá)的是外籍球員,所以他調(diào)用的是外籍球員所理解的方法=>也就是翻譯的作用
/// </summary>
class Translator : Player
{
private ForeignCenter fc = new ForeignCenter();
public Translator(string name) : base(name)
{
fc.Name = name;
}
public override void Attack()
{
fc.進(jìn)攻();
}
public override void Defense()
{
fc.防守();
}
}
/// <summary>
/// 作為外籍球員,他有自己的姓名和進(jìn)攻防守方式等
/// 其他的事情交給翻譯就好了
/// </summary>
class ForeignCenter
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public void 進(jìn)攻()
{
Console.WriteLine("外籍中鋒{0} 進(jìn)攻", name);
}
public void 防守()
{
Console.WriteLine("外籍中鋒{0} 防守", name);
}
}
}
適配器模式的優(yōu)缺點(diǎn)
像之前提到的適配器能在后期維護(hù)的時(shí)候起到很大的作用,能在開發(fā)新的功能的時(shí)候保護(hù)原來軟件的穩(wěn)定性,但是初期的時(shí)候還是能避免就盡量避免吧!
備注:文中所有代碼及知識(shí)點(diǎn)均來自于《大話設(shè)計(jì)模式》,本人屬于邊學(xué)邊看邊敲代碼邊總結(jié)的階段。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c# List find()方法返回值的問題說明(返回結(jié)果為對(duì)象的指針)
本篇文章主要介紹了c#中List find()方法返回值的問題說明(返回結(jié)果為對(duì)象的指針) 需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01
Unity中Instantiate實(shí)例化物體卡頓問題的解決
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)離線計(jì)時(shí)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
C#中如何使用Winform實(shí)現(xiàn)炫酷的透明動(dòng)畫界面
這篇文章講解了如何使用Winform實(shí)現(xiàn)炫酷的透明動(dòng)畫界面,Winform相對(duì)于Wpf使用更簡單一些,系統(tǒng)要求更低,需要了解的朋友可以參考下2015-07-07
C#Url操作類封裝、仿Node.Js中的Url模塊實(shí)例
這篇文章主要介紹了C#Url操作類封裝、仿Node.Js中的Url模塊,實(shí)例分析了C#Url操作類封裝的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-10-10

