.net設計模式 (介面卡模式)學習筆記
阿新 • • 發佈:2018-12-20
運用設計模式只是為了解決一類問題的,當解決掉當前一類問題,通常會在解決這個問題時候 帶來其他問題 合理應用揚長避短
結構性設計模式:
.net設計模式 (介面卡模式)學習筆記
概要: 介面卡模式多用於 對現有 系統的改造 或者 整合 第三方功能的時候。為貼合 自身系統 所做的改造。 對 本身系統 和 第三方功能 不做修改。只做自身系統做擴充套件
-
物件介面卡 通過組合實現
-
類介面卡 通過繼承實現 強耦合,靈活度低
比方說我們 現有系統 資料庫 對 Mysql, sqlsever, Oracal 都有封裝, 後來需要對系統進行優化,添加了第三方的 Redis(記憶體資料) 來做資料的優化。 接下來 我們將用 介面卡模式在不修改原有程式碼的。 情況下 用介面卡模式 擴展出對 Redis 的支援!
/// <summary> /// 原有 資料訪問介面 /// </summary> public interface IHelper { void Add<T>(); void Delete<T>(); void Update<T>(); void Query<T>(); } //原有對mysql 的支援 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 Query<T>() { Console.WriteLine("This is {0} Query", this.GetType().Name); } public void Update<T>() { Console.WriteLine("This is {0} Update", this.GetType().Name); } } //原有對Orical 的支援 public class OraclHelper : 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 Query<T>() { Console.WriteLine("This is {0} Query", this.GetType().Name); } public void Update<T>() { Console.WriteLine("This is {0} Update", this.GetType().Name); } } //原有對 Sqlserver 的支援 public class SqlserverHelper : 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 Query<T>() { Console.WriteLine("This is {0} Query", this.GetType().Name); } public void Update<T>() { Console.WriteLine("This is {0} Update", this.GetType().Name); } } /// <summary> /// 為優化效率 第三方 提供 新添新的功能 /// </summary> public class RedisHelpercs { 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); } } /// <summary> /// 類介面卡 /// </summary> public class RedisHelpercsClassAdpater : RedisHelpercs, IHelper { void IHelper.Add<T>() { base.AddRedis<T>(); } void IHelper.Delete<T>() { base.DeleteRedis<T>(); } void IHelper.Query<T>() { base.QueryRedis<T>(); } void IHelper.Update<T>() { base.UpdateRedis<T>(); } } /// <summary> /// 物件 介面卡 /// </summary> public class RedisHelpercsObjectAdpater : IHelper { private RedisHelpercs redisHelpercs; public RedisHelpercsObjectAdpater(RedisHelpercs _redisHelpercs) { this.redisHelpercs = _redisHelpercs; } void IHelper.Add<T>() { this.redisHelpercs.AddRedis<T>(); } void IHelper.Delete<T>() { this.redisHelpercs.DeleteRedis<T>(); } void IHelper.Query<T>() { this.redisHelpercs.QueryRedis<T>(); } void IHelper.Update<T>() { this.redisHelpercs.UpdateRedis<T>(); } }
從程式碼我們可以看出: 所謂 介面卡 就是 在不對原有程式碼進行修改的情況下, 對新填的功能部分 加了一層 甚至 兩層 來適應 當前系統
class Program
{
static void Main(string[] args)
{
//以前的方式1
IHelper helper = new MysqlHelper();
helper.Add<int>();
helper.Delete<int>();
//以前的方式2
IHelper helper1 = new OraclHelper();
helper1.Add<int>();
helper1.Delete<int>();
//類的介面卡 方式
IHelper helper2 = new RedisHelpercsClassAdpater();
helper2.Add<int>();
helper2.Delete<int>();
//物件介面卡 方式
IHelper helper3 = new RedisHelpercsObjectAdpater(new RedisHelpercs());
helper3.Add<int>();
helper3.Delete<int>();
}
}