结构型设计模式--适配器模式

using System;
using System.Collections.Generic;
using System.Text;

namespace DesignPattern.StructuralPattern.AdapterPattern
{
    public class AdapterPattern
    {
        //为啥要有适配器模式,为了解决什么问题
        //正如其名,它起的是适配的作用,什么情况下需要适配,可能我拿到一个类,我要用它其中的功能,它的规则和我现在的规则不一样(比如继承的接口不一样),那么我就要把它适配到我的系统里,就用到适配器
        //感觉跟代理模式很像,但是两者侧重点不一样,适配器是A适配到B  适配器是A的功能重新整理,或者给A增加一些新功能适配到B,代理是对A原有方法的包装,并不扩展新的业务方法,比如给A的方法增加日志,异常判断等
        //适配器关注调节    //代理关注屏蔽

        //适配器模式分为两种方式:
        //  1.类适配器,就是通过继承,强侵入,强绑定,我可能只需要A的部分功能,所以这种模式就不行了
        //  2.对象适配器,就是组合,来一个A类型的属性(给属性赋值有三种方式:属性默认值;通过构造函数;通过一般方法),包装下A的方法
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace DesignPattern.StructuralPattern.AdapterPattern
{
    interface IHelper
    {
        void Add<T>();
        void Delete<T>();
        void Update<T>();
        void Query<T>();
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace DesignPattern.StructuralPattern.AdapterPattern
{
    class SqlServerHelper : IHelper
    {
        public void Add<T>()
        {
            Console.WriteLine("sqlserver Add");
        }

        public void Delete<T>()
        {
            Console.WriteLine("sqlserver Delete");
        }

        public void Query<T>()
        {
            Console.WriteLine("sqlserver Query");
        }

        public void Update<T>()
        {
            Console.WriteLine("sqlserver Update");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace DesignPattern.StructuralPattern.AdapterPattern
{
    /// <summary>
    /// 这是来自第三方提供的  如果用它  因为两者规范不一致需要兼容我们的IHelper  就需要适配器
    /// </summary>
    public class RedisHelper
    {
        public void AddRedis<T>()
        {
            Console.WriteLine("sqlserver Add");
        }

        public void DeleteRedis<T>()
        {
            Console.WriteLine("sqlserver Delete");
        }

        public void QueryRedis<T>()
        {
            Console.WriteLine("sqlserver Query");
        }

        public void UpdateRedis<T>()
        {
            Console.WriteLine("sqlserver Update");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace DesignPattern.StructuralPattern.AdapterPattern
{
    /// <summary>
    /// 这种方式是继承版本的适配器---类适配器
    /// </summary>
    public class RedisAdapterInherit : RedisHelper, IHelper
    {
        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>();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace DesignPattern.StructuralPattern.AdapterPattern
{
    /// <summary>
    /// 通过组合来实现适配---对象适配器
    /// </summary>
    public class RedisAdapterObject : IHelper
    {
        //这是第一种:通过属性来实例化要适配的类,这种写死了属性,不支持扩展
        private static RedisHelper _rds = new RedisHelper();

        //第二种:通过构造函数实例化要适配的类,支持扩展,可以传入RedisHelper的子类
        public RedisAdapterObject(RedisHelper redis)
        {
            _rds = redis;
        }

        //第三种:通过一个方法来实例化要适配的类,支持扩展,但是有风险,这个方法没有提前调用,业务方法Add等执行会异常
        public void SetAdapter(RedisHelper redis)
        { 
            _rds = redis;
        }

        public void Add<T>()
        {
            throw new NotImplementedException();
        }

        public void Delete<T>()
        {
            throw new NotImplementedException();
        }

        public void Query<T>()
        {
            throw new NotImplementedException();
        }

        public void Update<T>()
        {
            throw new NotImplementedException();
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值