1. 程式人生 > >.net設計模式 (介面卡模式)學習筆記

.net設計模式 (介面卡模式)學習筆記

運用設計模式只是為了解決一類問題的,當解決掉當前一類問題,通常會在解決這個問題時候 帶來其他問題  合理應用揚長避短


結構性設計模式:

                          .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>();
        }
    }