前面完成了建立型的設計模式的分享,建立型的設計模式解決的是對象建立的問題。今天開始介紹結構型的設計模式,其中結構型設計模式包括:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。結構型設計模式解決的是類與對象的組合關係。今天講結構型對象中的第一個——適配器模式。適配器模式——顧名思義嘛。在咱們日常的理解中,適配器是幹啥用的呢?不就是將兩個本來不匹配的東西轉換爲匹配罷了。適配器是接口轉換器,好比電源適配器,USB接口轉換器等等。html
在系統程序中,咱們可能會面臨需求的增長或者改變,或者是應用環境的改變。經常須要將一些已經存在的類放在新的需求或者新的環境中應用。可是新的環境要求使用到的接口與如今存在的類或對象不徹底匹配。那麼如何去面對這樣的遷移變化呢?數據庫
將一個類的接口轉換成客戶但願的另外一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。 編程
在適配器模式中通常包含如下部分的存在:設計模式
客戶端:與目標接口配合協同使用this
目標接口:與客戶端協同使用spa
被適配角色:表示一個已經存在了並使用的接口設計
適配器:整個模式核心存在,將被適配角色轉換爲目標須要的接口。代理
接下來咱們看下這個示例,前段時間筆記本那個耳機圓孔接口壞掉了。這個時候我只有手機那種圓孔耳機。可是我也須要在電腦上面使用,那怎麼辦呢?我不想多花錢去買一個usb耳機,也沒有時間去把電腦修好。簡單、我去網上買一個耳機的Usb轉換器。而後就能夠在電腦上使用了。在這事例中,目標接口是電腦USB耳機,被適配角色是手機圓孔耳機,適配器就是圓孔耳機轉換爲USB的過程、電腦則是客戶端:code
namespace Adapter_Pattern { class AdapterPattern { } #region 目標角色——須要電腦usb耳機========================= /// <summary> /// 客戶端須要的接口 /// </summary> interface ComputerHeadsetTarget { void GetComputerHeadset(); } #endregion #region 被適配角色——如今存在的手機耳機===================== /// <summary> /// 目前已經存在的接口 /// </summary> public class Adaptee { public void PhoneHeadset() { Console.WriteLine("我如今擁有的是手機耳機。"); } } #endregion #region 對象適配器——將手機耳機轉換成電腦須要的usb耳機========== /// <summary> /// 對象適配器實現 /// </summary> public class ObjectAdapter : ComputerHeadsetTarget { Adaptee Adaptee = new Adaptee(); public void GetComputerHeadset() { Adaptee.PhoneHeadset(); Console.WriteLine("如今加入耳機Usb轉換器"); Console.WriteLine("輸出:電腦使用的usb耳機"); } } #endregion #region 類適配器——將手機耳機轉換成電腦須要的usb耳機=========== /// <summary> /// 類適配器的實現 /// </summary> public class ClassAdapter : Adaptee,ComputerHeadsetTarget { public void GetComputerHeadset() { this.PhoneHeadset(); Console.WriteLine("如今加入耳機Usb轉換器"); Console.WriteLine("輸出:電腦使用的usb耳機"); } } #endregion }
class Program { static void Main(string[] args) { Console.WriteLine("我如今須要電腦usb耳機"); ///對象適配器 ObjectAdapter objectAdapter = new ObjectAdapter(); objectAdapter.GetComputerHeadset(); Console.WriteLine("我如今須要電腦usb耳機"); ///類適配器 ClassAdapter classAdapter = new ClassAdapter(); classAdapter.GetComputerHeadset(); Console.ReadLine(); } }
這適配器模式主要用於一些但願被複用的類,可是這些類中的接口又與新的環境不徹底匹配的狀況下。老代碼遺留修改中、類庫遷移中用處較多。htm
在上面示例中寫了適配器的兩種實現方式,對象適配器和類適配器。對於類適配器來講既繼承了目標接口類又繼承了已存在接口類。在C#編程中儘可能採用多組合少繼承的形式進行代碼編寫。多繼承提升了類之間的耦合性。因此對於類適配器通常狀況儘可能少使用。而對於對象適配器來講採用的是對象組合的方式。
一、系統須要複用如今的類,可是類中接口與如今環境不徹底匹配
二、想要創建一個能夠複用的類,用於彼此之間沒有太大關聯的一些類。
對象適配器:
一、能夠再不修改原來的類的基礎上覆用原來的類,符合開閉原則
二、採用的」對象組合」,下降類之間的耦合性
類適配器:
一、能夠再不修改原來的類的基礎上覆用原來的類,符合開閉原則
二、能夠從新定義被適配角色類中一部分行爲,在類適配器中被適配角色類爲基類
三、僅是引用一個對象,不須要額外的字段引用實例
對象適配器:
一、從新定義被適配角色類中部分行爲困難
類適配器:
一、對於被適配角色類的子類中的一些方法就不能進行轉換了,由於沒有引用其實例,僅繼承基類。因此只能調用基類中的方法。
二、採用了多繼承的方式。提升了類之間的耦合性
你們會不會以爲Adapter這個單詞這麼熟悉呢?我剛看的時候也以爲蠻熟悉的樣子。應該大多數人都寫過DBHelper這個數據庫輔助類吧,在數據庫鏈接操做過程當中存在着DataSet對象和DataAdaper對象。DataAdaper也就是數據適配器,負責把DataSet與真實數據源鏈接起來。DataAdaper得到數據,而後將數據填充到DataSet對象中。針對於數據庫與DataSet之間的一種適配。這也是.NET中一種適配器模式的實現。
天再高又怎樣,踮起腳尖就更接近陽光。
歡迎你們掃描下方二維碼,和我一塊兒踏上設計模式的闖關之路吧!