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