前言
前面完成了創(chuàng)建型的設(shè)計(jì)模式的分享,創(chuàng)建型的設(shè)計(jì)模式解決的是對象創(chuàng)建的問題。今天開始介紹結(jié)構(gòu)型的設(shè)計(jì)模式,其中結(jié)構(gòu)型設(shè)計(jì)模式包括:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。結(jié)構(gòu)型設(shè)計(jì)模式解決的是類與對象的組合關(guān)系。今天講結(jié)構(gòu)型對象中的第一個(gè)——適配器模式。適配器模式——顧名思義嘛。在我們平常的理解中,適配器是干啥用的呢?不就是將兩個(gè)原本不匹配的東西轉(zhuǎn)換為匹配罷了。適配器是接口轉(zhuǎn)換器,比如電源適配器,USB接口轉(zhuǎn)換器等等。
適配器模式介紹
一、來由
在系統(tǒng)程序中,我們可能會(huì)面臨需求的增加或者改變,或者是應(yīng)用環(huán)境的改變。常常需要將一些已經(jīng)存在的類放在新的需求或者新的環(huán)境中應(yīng)用。但是新的環(huán)境要求使用到的接口與現(xiàn)在存在的類或?qū)ο蟛煌耆ヅ?。那么如何去面對這樣的遷移變化呢?
二、意圖
? 將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另一個(gè)接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。???
三、案例圖
?
四、適配器模式代碼示例
在適配器模式中一般包含以下部分的存在:
客戶端:與目標(biāo)接口配合協(xié)同使用
目標(biāo)接口:與客戶端協(xié)同使用
被適配角色:表示一個(gè)已經(jīng)存在了并使用的接口
適配器:整個(gè)模式核心存在,將被適配角色轉(zhuǎn)換為目標(biāo)需要的接口。
接下來我們看下這個(gè)示例,前段時(shí)間筆記本那個(gè)耳機(jī)圓孔接口壞掉了。這個(gè)時(shí)候我只有手機(jī)那種圓孔耳機(jī)。但是我也需要在電腦上面使用,那怎么辦呢?我不想多花錢去買一個(gè)usb耳機(jī),也沒有時(shí)間去把電腦修好。簡單、我去網(wǎng)上買一個(gè)耳機(jī)的Usb轉(zhuǎn)換器。然后就可以在電腦上使用了。在這事例中,目標(biāo)接口是電腦USB耳機(jī),被適配角色是手機(jī)圓孔耳機(jī),適配器就是圓孔耳機(jī)轉(zhuǎn)換為USB的過程、電腦則是客戶端:
?
namespace Adapter_Pattern { class AdapterPattern { } #region
目標(biāo)角色——需要電腦usb耳機(jī)=========================/// <summary> /// 客戶端需要的接口 ///
</summary> interface ComputerHeadsetTarget { void GetComputerHeadset(); }
#endregion #region 被適配角色——現(xiàn)在存在的手機(jī)耳機(jī)===================== /// <summary> ///
目前已經(jīng)存在的接口/// </summary> public class Adaptee { public void PhoneHeadset() {
Console.WriteLine("我現(xiàn)在擁有的是手機(jī)耳機(jī)。"); } } #endregion #region
對象適配器——將手機(jī)耳機(jī)轉(zhuǎn)換成電腦需要的usb耳機(jī)==========/// <summary> /// 對象適配器實(shí)現(xiàn) /// </summary>
public class ObjectAdapter : ComputerHeadsetTarget { Adaptee Adaptee = new
Adaptee();public void GetComputerHeadset() { Adaptee.PhoneHeadset();
Console.WriteLine("現(xiàn)在加入耳機(jī)Usb轉(zhuǎn)換器"); Console.WriteLine("輸出:電腦使用的usb耳機(jī)"); } }
#endregion #region 類適配器——將手機(jī)耳機(jī)轉(zhuǎn)換成電腦需要的usb耳機(jī)=========== /// <summary> /// 類適配器的實(shí)現(xiàn)
/// </summary> public class ClassAdapter : Adaptee,ComputerHeadsetTarget {
public void GetComputerHeadset() { this.PhoneHeadset(); Console.WriteLine("
現(xiàn)在加入耳機(jī)Usb轉(zhuǎn)換器"); Console.WriteLine("輸出:電腦使用的usb耳機(jī)"); } } #endregion }
?
class Program { static void Main(string[] args) { Console.WriteLine("
我現(xiàn)在需要電腦usb耳機(jī)"); ///對象適配器 ObjectAdapter objectAdapter = new ObjectAdapter();
objectAdapter.GetComputerHeadset(); Console.WriteLine("我現(xiàn)在需要電腦usb耳機(jī)"); ///類適配器
ClassAdapter classAdapter =new ClassAdapter();
classAdapter.GetComputerHeadset(); Console.ReadLine(); } }
?
使用場景及優(yōu)缺點(diǎn)
這適配器模式主要用于一些希望被復(fù)用的類,但是這些類中的接口又與新的環(huán)境不完全匹配的情況下。老代碼遺留修改中、類庫遷移中用處較多。
在上面示例中寫了適配器的兩種實(shí)現(xiàn)方式,對象適配器和類適配器。對于類適配器來說既繼承了目標(biāo)接口類又繼承了已存在接口類。在C#編程中盡量采用多組合少繼承的形式進(jìn)行代碼編寫。多繼承提高了類之間的耦合性。所以對于類適配器一般情況盡量少使用。而對于對象適配器來說采用的是對象組合的方式。
一、使用場景
1、系統(tǒng)需要復(fù)用現(xiàn)在的類,但是類中接口與現(xiàn)在環(huán)境不完全匹配
2、想要建立一個(gè)可以復(fù)用的類,用于彼此之間沒有太大關(guān)聯(lián)的一些類。
二、優(yōu)點(diǎn)
對象適配器:
1、可以再不修改原來的類的基礎(chǔ)上復(fù)用原來的類,符合開閉原則
2、采用的”對象組合”,降低類之間的耦合性
類適配器:
1、可以再不修改原來的類的基礎(chǔ)上復(fù)用原來的類,符合開閉原則
2、可以重新定義被適配角色類中一部分行為,在類適配器中被適配角色類為基類
3、僅是引用一個(gè)對象,不需要額外的字段引用實(shí)例
三、缺點(diǎn)
對象適配器:
1、重新定義被適配角色類中部分行為困難
類適配器:
1、對于被適配角色類的子類中的一些方法就不能進(jìn)行轉(zhuǎn)換了,因?yàn)闆]有引用其實(shí)例,僅繼承基類。所以只能調(diào)用基類中的方法。
2、采用了多繼承的方式。提高了類之間的耦合性
總結(jié)
大家會(huì)不會(huì)覺得Adapter這個(gè)單詞這么熟悉呢?我剛看的時(shí)候也覺得蠻熟悉的樣子。應(yīng)該大多數(shù)人都寫過DBHelper這個(gè)數(shù)據(jù)庫輔助類吧,在數(shù)據(jù)庫連接操作過程中存在著
DataSet對象和DataAdaper對象。DataAdaper也就是數(shù)據(jù)適配器,負(fù)責(zé)把DataSet與真實(shí)數(shù)據(jù)源連接起來。DataAdaper
獲得數(shù)據(jù),然后將數(shù)據(jù)填充到DataSet對象中。針對于數(shù)據(jù)庫與DataSet之間的一種適配。這也是.NET中一種適配器模式的實(shí)現(xiàn)。
?天再高又怎樣,踮起腳尖就更接近陽光。
?
C#設(shè)計(jì)模式系列目錄 <https://www.cnblogs.com/hulizhong/p/11394686.html>
歡迎大家掃描下方二維碼,和我一起踏上設(shè)計(jì)模式的闖關(guān)之路吧!
熱門工具 換一換