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#使用TensorFlow.NET訓(xùn)練自己的數(shù)據(jù)集的方法
這篇文章主要介紹了C#使用TensorFlow.NET訓(xùn)練自己的數(shù)據(jù)集的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03淺析C#中數(shù)組,ArrayList與List對(duì)象的區(qū)別
在C#中,當(dāng)我們想要存儲(chǔ)一組對(duì)象的時(shí)候,就會(huì)想到用數(shù)組,ArrayList,List這三個(gè)對(duì)象了。那么這三者到底有什么樣的區(qū)別呢2013-07-07C#實(shí)現(xiàn)關(guān)閉其他程序窗口或進(jìn)程代碼分享
這篇文章主要介紹了C#實(shí)現(xiàn)關(guān)閉其他程序窗口或進(jìn)程代碼分享,本文給出了兩種方法,并分別給出示例代碼,需要的朋友可以參考下2015-06-06

C#?HttpClient超時(shí)重試機(jī)制詳解

C#實(shí)現(xiàn)圖片放大功能的按照像素放大圖像方法