配接器模式:解決重構的問題,新東西和舊系統不吻合,通過組合/繼承進行配
配接器:插座,電源配接器,做個轉接的
程式員已經確定好規范IHelper,新增了一個RedisHelper----第三方,二者規范不一致,就是沒實作介面

/// <summary>/// 資料訪問介面/// </summary>public interface IHelper{ void Add<T>(); void Delete<T>(); void Update<T>(); void Query<T>();} public class MysqlHelper : IHelper { public void Add<T>() { Console.WriteLine("This is {0} Add", this.GetType().Name); } public void Delete<T>() { Console.WriteLine("This is {0} Delete", this.GetType().Name); } public void Update<T>() { Console.WriteLine("This is {0} Update", this.GetType().Name); } public void Query<T>() { Console.WriteLine("This is {0} Query", this.GetType().Name); } } /// <summary> /// 第三方提供的 openstack servicestack /// 不能修改 /// </summary> public class RedisHelper { public RedisHelper() { Console.WriteLine($"構造RedisHelper"); } public void AddRedis<T>() { Console.WriteLine("This is {0} Add", this.GetType().Name); } public void DeleteRedis<T>() { Console.WriteLine("This is {0} Delete", this.GetType().Name); } public void UpdateRedis<T>() { Console.WriteLine("This is {0} Update", this.GetType().Name); } public void QueryRedis<T>() { Console.WriteLine("This is {0} Query", this.GetType().Name); } }View Code
繼承:既滿足了現有的規范,又沒有去修改RedisHelper,配接器,類配接器

public class RedisHelperInherit : RedisHelper, IHelper{ public RedisHelperInherit() { Console.WriteLine($"構造{this.GetType().Name}"); } public void Add<T>() { base.AddRedis<T>(); } public void Delete<T>() { base.DeleteRedis<T>(); } public void Query<T>() { base.QueryRedis<T>(); } public void Update<T>() { base.UpdateRedis<T>(); }}View Code
組合:物件配接器

public class RedisHelperObject : IHelper{ public RedisHelperObject() { Console.WriteLine($"構造{this.GetType().Name}"); } private RedisHelper _RedisHelper = new RedisHelper();//屬性注入 宣告寫死 一定有 public RedisHelperObject(RedisHelper redisHelper)//建構式 可以替換(需要抽象) 一定有(不考慮其他建構式) { this._RedisHelper = redisHelper; } public void SetObject(RedisHelper redisHelper)//方法注入 可以替換(需要抽象) 不一定有 { this._RedisHelper = redisHelper; } public void Add<T>() { this._RedisHelper.AddRedis<T>(); } public void Delete<T>() { this._RedisHelper.DeleteRedis<T>(); } public void Query<T>() { this._RedisHelper.QueryRedis<T>(); } public void Update<T>() { this._RedisHelper.UpdateRedis<T>(); }}View Code
組合優于繼承嗎?
二者都會先構造一個RedisHelper
1、但是,繼承有強侵入,父類的東西子類必須有
2、靈活性,繼承只為一個類服務,組合可以面向抽象誒多個型別服務

//繼承 既滿足現有的規范呼叫,又沒有修改RedisHelper //類配接器模式 Console.WriteLine("*****************************"); { IHelper helper = new RedisHelperInherit(); helper.Add<Program>(); helper.Delete<Program>(); helper.Update<Program>(); helper.Query<Program>(); } //組合 既滿足現有的規范呼叫,又沒有修改RedisHelper //物件配接器 Console.WriteLine("*****************************"); { IHelper helper = new RedisHelperObject(); helper.Add<Program>(); helper.Delete<Program>(); helper.Update<Program>(); helper.Query<Program>(); } //組合優于繼承? //二者都會先構造一個RedisHelper,但是繼承是強侵入,父類的東西子類必須有 //靈活性,繼承只為一個類服務;組合可以面向抽象為多個型別服務 { RedisHelperInherit redisHelperInherit = new RedisHelperInherit(); redisHelperInherit.DeleteRedis<Program>(); } { RedisHelperObject redisHelperObject = new RedisHelperObject(); redisHelperObject.Add<Program>(); }View Code
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/46484.html
標籤:設計模式
上一篇:設計模式-抽象工廠
下一篇:設計模式-代理模式

