C#適配器模式的使用
前言
我昨天做了個(gè)夢(mèng),我夢(mèng)見(jiàn)我在一條路走,走的時(shí)候經(jīng)過(guò)一個(gè)房間,里面關(guān)著一條邊牧和雞和豬,后來(lái)我醒了,我知道那只邊牧就是小葉子(哈仔十一的邊牧),小葉子具備牧羊和牧雞的技能,因此,假如我想把一只邊牧或者一只狗變成小葉子那樣,那么首先就得讓其賦予牧雞的本事,而十一(哈仔十一的哈士奇)則具備賣萌的技能

適配器模式
我們先定義一些代碼
internal interface IDog
{
public void Eat();
public void Bark();
}
/// <summary>
/// 哈士奇
/// </summary>
internal interface IHuskyDog:IDog
{
/// <summary>
/// 破壞、拆家
/// </summary>
public void Demolition();
}
/// <summary>
/// 牧羊犬
/// </summary>
internal interface IShepherdDog:IDog
{
/// <summary>
/// 牧羊
/// </summary>
public void Shepherd();
}
/// <summary>
/// 小葉子、小椰汁
/// </summary>
internal class XiaoYezi : IShepherdDog
{
public void Bark()
{
Console.WriteLine($"I Am {nameof(XiaoYezi)} 汪 汪 汪 !!!!!");
}
public void Eat()
{
Console.WriteLine($"I Am {nameof(XiaoYezi)} 好吃 !!!!!");
}
/// <summary>
/// 牧羊
/// </summary>
public void Shepherd()
{
Console.WriteLine($"I Am {nameof(XiaoYezi)}, 我在牧羊 !!!!!");
}
}
/// <summary>
/// 十一
/// </summary>
internal class ShiYi : IHuskyDog
{
public void Bark()
{
Console.WriteLine($"I Am {nameof(ShiYi)} 汪 汪 汪 !!!!!");
}
public void Demolition()
{
Console.WriteLine($"I Am {nameof(ShiYi)} ,拆家啦 !!!!!");
}
public void Eat()
{
Console.WriteLine($"I Am {nameof(ShiYi)} 好吃得停不下來(lái) !!!!!");
}
}
那么,用代碼怎么寫呢?或許你會(huì)定義一個(gè)變?nèi)~子的接口,有個(gè)方法叫HerdingChicken ,讓其實(shí)現(xiàn)牧雞的技能就行,但是實(shí)際上這里有兩個(gè)主要問(wèn)題:
- 葉子本身是一個(gè)狗,如果其他人實(shí)現(xiàn)了這個(gè)接口,他能變?nèi)~子?是不是前提他是狗
- 假如葉子不單單只是牧雞,她會(huì)牧鵝、豬、牧自己?還得多接口,或者在變?nèi)~子的接口加方法給其實(shí)現(xiàn)
這時(shí)候適配器模式就是可以適應(yīng)這種情況:
internal class XiaoYeziAdapter : IShepherdDog
{
public IDog Dog { get; set; }
public XiaoYeziAdapter(IDog dog)
{
Dog = dog;
}
public void Bark()
{
Dog.Bark();
}
public void Eat()
{
Dog.Eat();
}
public void Shepherd()
{
if (Dog is IShepherdDog shepherdDog)
{
shepherdDog.Shepherd();
}
}
/// <summary>
/// 牧雞
/// </summary>
public void HerdingChicken()
{
Console.WriteLine($"{Dog.GetType().Name} is Herding Chicken");
}
}
代碼如下:
var xiaoYezi = new XiaoYezi();
var xiaoYeziAdapter = new XiaoYeziAdapter(xiaoYezi);
xiaoYeziAdapter.Bark();
xiaoYeziAdapter.Eat();
xiaoYeziAdapter.HerdingChicken();
Console.WriteLine("---------------- \n");
var shiYi = new ShiYi();
xiaoYeziAdapter = new XiaoYeziAdapter(shiYi);
xiaoYeziAdapter.Bark();
xiaoYeziAdapter.Eat();
xiaoYeziAdapter.HerdingChicken();
輸出:
I Am XiaoYezi 汪 汪 汪 !!!!!
I Am XiaoYezi 好吃 !!!!!
XiaoYezi 在牧雞
----------------I Am ShiYi 汪 汪 汪 !!!!!
I Am ShiYi 好吃得停不下來(lái) !!!!!
ShiYi 在牧雞
可以看到,十一用了小葉子適配器,也具備了牧雞的功能

那么反過(guò)來(lái),葉子變十一呢?那就定義一個(gè)十一適配器唄

internal class ShiYiAdapter : IHuskyDog
{
public IDog Dog { get; set; }
public ShiYiAdapter(IDog dog)
{
Dog=dog;
}
/// <summary>
/// 吠
/// </summary>
/// <exception cref="NotImplementedException"></exception>
public void Bark()
{
Dog.Bark();
}
/// <summary>
/// 拆家
/// </summary>
/// <exception cref="NotImplementedException"></exception>
public void Demolition()
{
if (Dog is IHuskyDog huskyDog)
{
huskyDog.Demolition();
}
}
/// <summary>
/// 吃
/// </summary>
/// <exception cref="NotImplementedException"></exception>
public void Eat()
{
Dog.Eat();
}
/// <summary>
/// 賣萌
/// </summary>
public void ActingCute()
{
Console.WriteLine($"{Dog.GetType().Name} 賣萌啦?。?);
}
}
代碼如下:
var xiaoYezi = new XiaoYezi();
var shiYiAdapter = new ShiYiAdapter(xiaoYezi);
shiYiAdapter.Bark();
shiYiAdapter.ActingCute();
shiYiAdapter.Demolition();
Console.WriteLine("---------------- \n");
var shiYi = new ShiYi();
shiYiAdapter = new ShiYiAdapter(shiYi);
shiYiAdapter.Bark();
shiYiAdapter.ActingCute();
shiYiAdapter.Demolition();
輸出:
I Am XiaoYezi 汪 汪 汪 !!!!!
XiaoYezi 賣萌啦??!
----------------I Am ShiYi 汪 汪 汪 !!!!!
ShiYi 賣萌啦??!
I Am ShiYi ,拆家啦 !!!!!
看,小葉子具備賣萌的技能了,而且由于拆家是哈士奇的技能,因此小葉子拆家沒(méi)拆到,實(shí)際上,或者賣萌和牧雞只是哈仔十一(大哈)家的特色,那么是不是可以定義一個(gè)大哈家的適配器

/// <summary>
/// 哈仔十一家的狗適配器
/// </summary>
internal class DaHaFamilyDogAdapter
{
public IDog Dog { get; set; }
public DaHaFamilyDogAdapter(IDog dog)
{
Dog = dog;
}
/// <summary>
/// 牧雞
/// </summary>
public void HerdingChicken()
{
Console.WriteLine($"{Dog.GetType().Name} 在牧雞");
}
/// <summary>
/// 賣萌
/// </summary>
public void ActingCute()
{
Console.WriteLine($"{Dog.GetType().Name} 在賣萌");
}
}
那么
var xiaoYezi = new XiaoYezi();
var daHaFamilyDogAdapter = new DaHaFamilyDogAdapter(xiaoYezi);
daHaFamilyDogAdapter.Bark();
daHaFamilyDogAdapter.Eat();
daHaFamilyDogAdapter.HerdingChicken();
daHaFamilyDogAdapter.ActingCute();
Console.WriteLine("---------------- \n");
var shiYi = new ShiYi();
daHaFamilyDogAdapter = new DaHaFamilyDogAdapter(shiYi);
daHaFamilyDogAdapter.Bark();
daHaFamilyDogAdapter.Eat();
daHaFamilyDogAdapter.HerdingChicken();
daHaFamilyDogAdapter.ActingCute();
輸出:
I Am XiaoYezi 汪 汪 汪 !!!!!
I Am XiaoYezi 好吃 !!!!!
XiaoYezi 在牧雞
XiaoYezi 在賣萌
----------------I Am ShiYi 汪 汪 汪 !!!!!
I Am ShiYi 好吃得停不下來(lái) !!!!!
ShiYi 在牧雞
ShiYi 在賣萌
到此這篇關(guān)于C#適配器模式的使用的文章就介紹到這了,更多相關(guān)C#適配器模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)的中國(guó)移動(dòng)官網(wǎng)手機(jī)號(hào)碼采集器
這篇文章主要介紹了C#實(shí)現(xiàn)的中國(guó)移動(dòng)官網(wǎng)手機(jī)號(hào)碼采集器,本文先是采集號(hào)碼入庫(kù),同時(shí)給出了篩選各類靚號(hào)的SQL語(yǔ)句,需要的朋友可以參考下2014-10-10
c# Selenium爬取數(shù)據(jù)時(shí)防止webdriver封爬蟲的方法
這篇文章主要介紹了c# Selenium爬取數(shù)據(jù)時(shí)防止webdriver封爬蟲的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-01-01
C#實(shí)現(xiàn)Menu和ContextMenu自定義風(fēng)格及contextMenu自定義
ContextMenu 類表示當(dāng)用戶在控件或窗體的特定區(qū)域上單擊鼠標(biāo)右鍵時(shí)會(huì)顯示的快捷菜單,要想實(shí)現(xiàn)自定義的Menu和ContextMenu效果,大家可以通過(guò)派生ProfessionalColorTable類,下面小編把實(shí)現(xiàn)Menu和ContextMenu自定義風(fēng)格及ContextMenu自定義給大家整理一下2015-08-08
C#實(shí)現(xiàn)讀取匿名對(duì)象屬性值的方法示例總結(jié)
這篇文章主要介紹了C#實(shí)現(xiàn)讀取匿名對(duì)象屬性值的方法,結(jié)合實(shí)例形式總結(jié)分析了C#通過(guò)反射、轉(zhuǎn)換等方法讀取匿名對(duì)象屬性值的相關(guān)操作技巧,需要的朋友可以參考下2020-03-03
C#實(shí)現(xiàn)的json序列化和反序列化代碼實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的json序列化和反序列化代碼實(shí)例,本文講解了兩種實(shí)現(xiàn)方法,并直接給出代碼示例,需要的朋友可以參考下2015-06-06
將DataTable轉(zhuǎn)換成List<T>實(shí)現(xiàn)思路及示例代碼
首先,這是我寫的一個(gè)通用轉(zhuǎn)換類,完成此類操作。也是實(shí)現(xiàn)這個(gè)功能最核心的部分。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11
C#實(shí)現(xiàn)網(wǎng)絡(luò)通信共享庫(kù)NetShare的使用示例
本文主要介紹了C#實(shí)現(xiàn)網(wǎng)絡(luò)通信共享庫(kù)NetShare,網(wǎng)絡(luò)通信共享庫(kù)NetShare用于保證客戶端與服務(wù)器通信數(shù)據(jù)包的規(guī)范和統(tǒng)一,感興趣的可以了解一下2023-11-11
C#控制IE進(jìn)程關(guān)閉和緩存清理的實(shí)現(xiàn)代碼
這篇文章主要介紹了C#控制IE進(jìn)程關(guān)閉和緩存清理的實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-04-04

