亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c#設計模式 適配器模式詳細介紹

2020-01-24 03:40:20
字體:
來源:轉載
供稿:網友
后續內容將包括以下結構模式:

適配器模式(Adapter):Match interfaces of different classes合成模式(Composite):A tree structure of simple and composite objects裝飾模式(Decorator):Add responsibilities to objects dynamically代理模式(Proxy):An object representing another object享元模式(Flyweight):A fine-grained instance used for efficient sharing門面模式(Facade):A single class that represents an entire subsystem橋梁模式(Bridge):Separates an object interface from its implementation

一、 適配器(Adapter)模式

適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本接口不匹配而無法在一起工作的兩個類能夠在一起工作。

名稱由來

這很像變壓器(Adapter),變壓器把一種電壓變換成另一種電壓。美國的生活用電電壓是110V,而中國的電壓是220V。如果要在中國使用美國電器,就必須有一個能把220V電壓轉換成110V電壓的變壓器。這個變壓器就是一個Adapter。

Adapter模式也很像貨物的包裝過程:被包裝的貨物的真實樣子被包裝所掩蓋和改變,因此有人把這種模式叫做包裝(Wrapper)模式。事實上,大家經常寫很多這樣的Wrapper類,把已有的一些類包裝起來,使之有能滿足需要的接口。

適配器模式的兩種形式

適配器模式有類的適配器模式和對象的適配器模式兩種。我們將分別討論這兩種Adapter模式。

二、 類的Adapter模式的結構:


由圖中可以看出,Adaptee類沒有Request方法,而客戶期待這個方法。為了使客戶能夠使用Adaptee類,提供一個中間環節,即類Adapter類,Adapter類實現了Target接口,并繼承自Adaptee,Adapter類的Request方法重新封裝了Adaptee的SpecificRequest方法,實現了適配的目的。

因為Adapter與Adaptee是繼承的關系,所以這決定了這個適配器模式是類的。

該適配器模式所涉及的角色包括:

目標(Target)角色:這是客戶所期待的接口。因為C#不支持多繼承,所以Target必須是接口,不可以是類。
源(Adaptee)角色:需要適配的類。
適配器(Adapter)角色:把源接口轉換成目標接口。這一角色必須是類。

三、 類的Adapter模式示意性實現:

下面的程序給出了一個類的Adapter模式的示意性的實現:
復制代碼 代碼如下:

// Class Adapter pattern -- Structural example
using System;

// "ITarget"
interface ITarget
{
// Methods
void Request();
}

// "Adaptee"
class Adaptee
{
// Methods
public void SpecificRequest()
{
Console.WriteLine("Called SpecificRequest()" );
}
}

// "Adapter"
class Adapter : Adaptee, ITarget
{
// Implements ITarget interface
public void Request()
{
// Possibly do some data manipulation
// and then call SpecificRequest
this.SpecificRequest();
}
}

/**//// <summary>
/// Client test
/// </summary>
public class Client
{
public static void Main(string[] args)
{
// Create adapter and place a request
ITarget t = new Adapter();
t.Request();
}
}

四、 對象的Adapter模式的結構:

 

從圖中可以看出:客戶端需要調用Request方法,而Adaptee沒有該方法,為了使客戶端能夠使用Adaptee類,需要提供一個包裝(Wrapper)類Adapter。這個包裝類包裝了一個Adaptee的實例,從而將客戶端與Adaptee銜接起來。由于Adapter與Adaptee是委派關系,這決定了這個適配器模式是對象的。

該適配器模式所涉及的角色包括:

目標(Target)角色:這是客戶所期待的接口。目標可以是具體的或抽象的類,也可以是接口。
源(Adaptee)角色:需要適配的類。
適配器(Adapter)角色:通過在內部包裝(Wrap)一個Adaptee對象,把源接口轉換成目標接口。


五、 對象的Adapter模式示意性實現:

下面的程序給出了一個類的Adapter模式的示意性的實現:
復制代碼 代碼如下:

// Adapter pattern -- Structural example
using System;

// "Target"
class Target
{
// Methods
virtual public void Request()
{
// Normal implementation goes here
}
}

// "Adapter"
class Adapter : Target
{
// Fields
private Adaptee adaptee = new Adaptee();

// Methods
override public void Request()
{
// Possibly do some data manipulation
// and then call SpecificRequest
adaptee.SpecificRequest();
}
}

// "Adaptee"
class Adaptee
{
// Methods
public void SpecificRequest()
{
Console.WriteLine("Called SpecificRequest()" );
}
}

/**//// <summary>
/// Client test
/// </summary>
public class Client
{
public static void Main(string[] args)
{
// Create adapter and place a request
Target t = new Adapter();
t.Request();
}
}


六、 在什么情況下使用適配器模式
在以下各種情況下使用適配器模式:

1、 系統需要使用現有的類,而此類的接口不符合系統的需要。
2、 想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。這些源類不一定有很復雜的接口。
3、 (對對象適配器而言)在設計里,需要改變多個已有子類的接口,如果使用類的適配器模式,就要針對每一個子類做一個適配器,而這不太實際。

七、 一個實際應用Adapter模式的例子
下面的程序演示了Class Adapter與Object Adapter的應用。
復制代碼 代碼如下:

// Example of implementing the Adapter pattern
using System;

// Target
public interface ICar
{
void Drive();
}

// Direct use without Adapter
public class CToyota : ICar
{
public void Drive()
{
Console.WriteLine("Vroom Vroom, we're off in our Toyota");
}
}

// Adaptee
public class CCessna
{
public void Fly()
{
Console.WriteLine("Static runup OK, we're off in our C172");
}
}

// Class Adapter
public class CDrivableCessna : CCessna, ICar
{
public void Drive() { base.Fly(); }
}

// Object Adapter
public class CDrivableCessna2 : ICar
{
private CCessna m_oContained;

public CDrivableCessna2()
{
m_oContained = new CCessna();
}

public void Drive() { m_oContained.Fly(); }
}

// Client
public class Client
{
public static void Main(string[] args)
{
ICar oCar = new CToyota();

Console.Write("Class Adapter: Driving an Automobile");
oCar.Drive();
oCar = new CDrivableCessna();
Console.Write("Driving a Cessna");
oCar.Drive();
oCar = new CDrivableCessna2();
Console.Write(" Object Adapter: Driving a Cessna");
oCar.Drive();
}
}


八、 關于Adapter模式的討論

Adapter模式在實現時有以下這些值得注意的地方:

1、 目標接口可以省略,模式發生退化。但這種做法看似平庸而并不平庸,它可以使Adaptee不必實現不需要的方法(可以參考Default Adapter模式)。其表現形式就是父類實現缺省方法,而子類只需實現自己獨特的方法。這有些像模板(Template)模式。
2、 適配器類可以是抽象類。
3、 帶參數的適配器模式。使用這種辦法,適配器類可以根據參數返還一個合適的實例給客戶端。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av电影院| 国产性色av一区二区| 欧美电影电视剧在线观看| 欧美wwwxxxx| 中文字幕亚洲一区二区三区五十路| 成人免费看吃奶视频网站| 精品久久久av| 在线看日韩欧美| 一区二区欧美日韩视频| 欧美中文字幕视频在线观看| 尤物yw午夜国产精品视频| 亚洲精品久久久久| 亚洲无av在线中文字幕| 91精品视频免费看| 九九久久久久久久久激情| 日韩在线观看免费全集电视剧网站| 久久久国产影院| 狠狠爱在线视频一区| 亚洲精品美女在线观看播放| 国产美女高潮久久白浆| 亚洲一区久久久| 国产一区二区色| 黄色一区二区在线| 亚洲石原莉奈一区二区在线观看| 久久天天躁夜夜躁狠狠躁2022| 亚洲电影免费在线观看| 亚洲第一精品久久忘忧草社区| 亚洲精美色品网站| 亚洲精品国产精品国产自| 亚洲图片欧美日产| 国产一区二区三区在线观看网站| 久久精品国产清自在天天线| 丝袜一区二区三区| 欧美性生交xxxxx久久久| 国产经典一区二区| 久久久久久亚洲精品中文字幕| 国产精品国产三级国产aⅴ9色| 日韩精品中文字幕视频在线| 亚洲国产91色在线| 亚洲黄色成人网| 美女撒尿一区二区三区| 操日韩av在线电影| 久久综合色88| 国产日韩欧美日韩大片| 欧美成人午夜剧场免费观看| 黑人巨大精品欧美一区二区三区| 午夜美女久久久久爽久久| 欧美电影《睫毛膏》| 98精品国产自产在线观看| 日韩视频免费中文字幕| 国产v综合v亚洲欧美久久| 亚洲xxxx做受欧美| 精品欧美aⅴ在线网站| 欧美日韩成人精品| 久久伊人精品天天| 69影院欧美专区视频| 欧美性xxxx极品hd欧美风情| 久久av中文字幕| 亚洲无亚洲人成网站77777| 亚洲精品v天堂中文字幕| 91视频国产精品| 日韩欧美在线免费观看| 亚洲自拍偷拍视频| 日本精品久久电影| 69视频在线播放| 欧美怡红院视频一区二区三区| 美女黄色丝袜一区| 久久久亚洲影院| 国产精品一久久香蕉国产线看观看| 久久中文字幕视频| 国产亚洲a∨片在线观看| 91精品国产高清自在线看超| 在线观看欧美日韩国产| 国产美女精品免费电影| 97成人精品区在线播放| 欧美日韩国产精品| 亚洲自拍小视频免费观看| 亚洲国产精品悠悠久久琪琪| 欧美中文字幕视频| 日韩有码视频在线| 九九精品视频在线| 国产成人精品一区二区三区| 色综合天天狠天天透天天伊人| 亚洲精品成人网| 欧美激情视频网站| 国产精品视频永久免费播放| 亚洲成年人在线播放| 国产精品普通话| 国产精品毛片a∨一区二区三区|国| 日韩av片永久免费网站| 国产欧美亚洲精品| 欧美高清在线播放| 国产精品久久久久久久久久久久久久| 国产精品 欧美在线| 久久人人97超碰精品888| 国产亚洲精品va在线观看| 亚洲视频在线免费观看| 中文字幕欧美专区| 亚洲视频欧洲视频| 少妇激情综合网| 一个色综合导航| 91美女福利视频高清| 国产精品视频专区| 91wwwcom在线观看| 亚洲人成网站色ww在线| 国产成人一区二区三区| 456亚洲影院| 理论片在线不卡免费观看| 日韩精品免费在线观看| 欧美主播福利视频| 精品成人乱色一区二区| 国产成人+综合亚洲+天堂| 久久精品国产精品亚洲| 成人h猎奇视频网站| 亚洲乱码av中文一区二区| 国产精品a久久久久久| 欧美精品久久久久| 久久夜色精品亚洲噜噜国产mv| 欧美香蕉大胸在线视频观看| 亚洲国产天堂久久国产91| 国产精品久久综合av爱欲tv| 日韩一区视频在线| 色悠久久久久综合先锋影音下载| 国产国语videosex另类| 国产精品成人免费电影| 国产精品中文字幕在线观看| 亚洲综合自拍一区| 欧美黑人巨大精品一区二区| 亚洲日韩中文字幕| 亚洲国产福利在线| 欧美国产中文字幕| 国产91精品久久久久久久| 欧美放荡办公室videos4k| 亚洲人成电影网站色| 国产91对白在线播放| 欧美壮男野外gaytube| 亚洲成人激情视频| 日韩大陆欧美高清视频区| 久久中文精品视频| 欧美激情日韩图片| 日韩在线中文字| 久久人人爽人人爽人人片亚洲| 色偷偷88888欧美精品久久久| 久精品免费视频| 亚洲精品成人久久久| 欧美乱大交xxxxx另类电影| 国产福利精品av综合导导航| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品久久久久9999| 亚洲毛茸茸少妇高潮呻吟| 欧美黑人极品猛少妇色xxxxx| 狠狠色噜噜狠狠狠狠97| 中日韩午夜理伦电影免费| 国产mv免费观看入口亚洲| 91精品国产色综合久久不卡98| 亚洲激情小视频| 久久久久国产一区二区三区| 97视频在线观看免费高清完整版在线观看| 亚洲free性xxxx护士hd| 久久久欧美一区二区| 亚洲老板91色精品久久| 欧美国产日韩视频| 日本欧美中文字幕| 精品亚洲一区二区三区|