设计模式:适配器模式
假如现在一个已经上线了的项目,现在为了提高性能需要增加Redis。
Redis的数据操作,第三方已经给提供了,但是他提供的数据操作接口和现在的接口不同,调用端又希望按照之前定义的接口来调用。
适配器模式就是解决这类问题的。
代码演示:
/// <summary>
/// 数据操作接口
/// </summary>
public interface ISqlHelper
{
void Add<T>();
void Delete<T>();
void Update<T>();
void Query<T>();
}
/// <summary>
/// SqlServer 数据库操作类
/// </summary>
public class SqlServerHelper : ISqlHelper
{
public void Add<T>()
{
Console.WriteLine($"This is {this.GetType().Name} Add.");
}
public void Delete<T>()
{
Console.WriteLine($"This is {this.GetType().Name} Delete.");
}
public void Query<T>()
{
Console.WriteLine($"This is {this.GetType().Name} Query.");
}
public void Update<T>()
{
Console.WriteLine($"This is {this.GetType().Name} Update.");
}
}
/// <summary>
/// Redis 数据库操作类
/// 假设是第三方提供的,而且不能修改
/// </summary>
public class RedisHelper
{
public void AddRedis<T>()
{
Console.WriteLine($"This is {this.GetType().Name} Add!");
}
public void DeleteRedis<T>()
{
Console.WriteLine($"This is {this.GetType().Name} Delete!");
}
public void UpdateRedis<T>()
{
Console.WriteLine($"This is {this.GetType().Name} Update!");
}
public void QueryRedis<T>()
{
Console.WriteLine($"This is {this.GetType().Name} Query!");
}
}
/// <summary>
/// 适配器: 通过继承的方式实现适配(满足ISqlHelper接口,另外继承RedisHelper)
/// </summary>
public class RedisHelperInherit : RedisHelper, ISqlHelper
{
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>();
}
}
/// <summary>
/// 调用
/// </summary>
static void Main(string[] args)
{
ISqlHelper sqlHelper = new SqlServerHelper();
sqlHelper.Add<Student>();
Console.WriteLine("**************************************");
ISqlHelper redisHelper = new RedisHelperInherit();
redisHelper.Add<Student>();
Console.ReadKey();
}
上面的示例是采用继承的方式来实现的,下面的代码将采用组合的方式来实现,代码如下:
/// <summary>
/// 适配器:通过组合的方式来实现
/// </summary>
public class RedisHelperCombination : ISqlHelper
{
/// <summary>
/// 字段属性方式组合(方式一)
/// 默认构造,特别强硬的
/// </summary>
private RedisHelper redisHelper = new RedisHelper();
private RedisHelper _RedisHelper = null;
/// <summary>
/// 构造函数方式组合(方式二)
/// 实例化时传入,相对字段属性灵活一点
/// </summary>
public RedisHelperCombination(RedisHelper redisHelper)
{
this._RedisHelper = redisHelper;
}
/// <summary>
/// 方法方式组合
/// 对象 可有可无,因为方法可调用可不调用
/// </summary>
public void AddRedisHelper(RedisHelper redisHelper)
{
this._RedisHelper = redisHelper;
}
void ISqlHelper.Add<T>()
{
this.redisHelper.AddRedis<T>();
}
void ISqlHelper.Delete<T>()
{
this.redisHelper.DeleteRedis<T>();
}
void ISqlHelper.Query<T>()
{
this.redisHelper.QueryRedis<T>();
}
void ISqlHelper.Update<T>()
{
this.redisHelper.UpdateRedis<T>();
}
}

浙公网安备 33010602011771号