设计模式:适配器模式
假如现在一个已经上线了的项目,现在为了提高性能需要增加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 (); } }