设计模式:适配器模式


假如现在一个已经上线了的项目,现在为了提高性能需要增加Redis。
Redis的数据操作,第三方已经给提供了,但是他提供的数据操作接口和现在的接口不同,调用端又希望按照之前定义的接口来调用。
适配器模式就是解决这类问题的。
代码演示:

    /// 
    /// 数据操作接口
    /// 
    public interface ISqlHelper
    {
        void Add();
        void Delete();
        void Update();
        void Query();
    }

    /// 
    /// SqlServer 数据库操作类
    /// 
    public class SqlServerHelper : ISqlHelper
    {
        public void Add()
        {
            Console.WriteLine($"This is {this.GetType().Name} Add.");
        }

        public void Delete()
        {
            Console.WriteLine($"This is {this.GetType().Name} Delete.");
        }

        public void Query()
        {
            Console.WriteLine($"This is {this.GetType().Name} Query.");
        }

        public void Update()
        {
            Console.WriteLine($"This is {this.GetType().Name} Update.");
        }
    }

    /// 
    /// Redis 数据库操作类
    /// 假设是第三方提供的,而且不能修改
    /// 
    public class RedisHelper
    {
        public void AddRedis()
        {
            Console.WriteLine($"This is {this.GetType().Name} Add!");
        }
        public void DeleteRedis()
        {
            Console.WriteLine($"This is {this.GetType().Name} Delete!");
        }
        public void UpdateRedis()
        {
            Console.WriteLine($"This is {this.GetType().Name} Update!");
        }
        public void QueryRedis()
        {
            Console.WriteLine($"This is {this.GetType().Name} Query!");
        }
    }

    
    /// 
    /// 适配器: 通过继承的方式实现适配(满足ISqlHelper接口,另外继承RedisHelper)
    /// 
    public class RedisHelperInherit : RedisHelper, ISqlHelper
    {
        public void Add()
        {
            base.AddRedis();
        }

        public void Delete()
        {
            base.DeleteRedis();
        }

        public void Query()
        {
            base.QueryRedis();
        }

        public void Update()
        {
            base.UpdateRedis();
        }
    }

    
       /// 
        /// 调用
        /// 
        static void Main(string[] args)
        {
            ISqlHelper sqlHelper = new SqlServerHelper();
            sqlHelper.Add();

            Console.WriteLine("**************************************");

            ISqlHelper redisHelper = new RedisHelperInherit();
            redisHelper.Add();

            Console.ReadKey();
        }

上面的示例是采用继承的方式来实现的,下面的代码将采用组合的方式来实现,代码如下:

    /// 
    /// 适配器:通过组合的方式来实现
    /// 
    public class RedisHelperCombination : ISqlHelper
    {
        /// 
        /// 字段属性方式组合(方式一)
        /// 默认构造,特别强硬的
        /// 
        private RedisHelper redisHelper = new RedisHelper();

        private RedisHelper _RedisHelper = null;
        /// 
        /// 构造函数方式组合(方式二)
        /// 实例化时传入,相对字段属性灵活一点
        /// 
        public RedisHelperCombination(RedisHelper redisHelper)
        {
            this._RedisHelper = redisHelper;
        }
        /// 
        /// 方法方式组合
        /// 对象 可有可无,因为方法可调用可不调用
        /// 
        public void AddRedisHelper(RedisHelper redisHelper)
        {
            this._RedisHelper = redisHelper;
        }

        void ISqlHelper.Add()
        {
            this.redisHelper.AddRedis();
        }
        void ISqlHelper.Delete()
        {
            this.redisHelper.DeleteRedis();
        }
        void ISqlHelper.Query()
        {
            this.redisHelper.QueryRedis();
        }
        void ISqlHelper.Update()
        {
            this.redisHelper.UpdateRedis();
        }
    }