1.结构型设计模式:关注类与类之间的交互
适配器模式:把一个类适配到原有的接口上,可以组合,可以继承
下面是一个接口和不同的实现
1 /// <summary> 2 /// 数据访问接口 3 /// </summary> 4 public interface IHelper 5 { 6 void Add<T>(); 7 void Delete<T>(); 8 void Update<T>(); 9 void Query<T>(); 10 }
1 public class MysqlHelper : IHelper 2 { 3 public void Add<T>() 4 { 5 Console.WriteLine("This is {0} Add", this.GetType().Name); 6 } 7 public void Delete<T>() 8 { 9 Console.WriteLine("This is {0} Delete", this.GetType().Name); 10 } 11 public void Update<T>() 12 { 13 Console.WriteLine("This is {0} Update", this.GetType().Name); 14 } 15 public void Query<T>() 16 { 17 Console.WriteLine("This is {0} Query", this.GetType().Name); 18 } 19 }
1 public class OracleHelper : IHelper 2 { 3 public void Add<T>() 4 { 5 Console.WriteLine("This is {0} Add", this.GetType().Name); 6 } 7 public void Delete<T>() 8 { 9 Console.WriteLine("This is {0} Delete", this.GetType().Name); 10 } 11 public void Update<T>() 12 { 13 Console.WriteLine("This is {0} Update", this.GetType().Name); 14 } 15 public void Query<T>() 16 { 17 Console.WriteLine("This is {0} Query", this.GetType().Name); 18 } 19 }
1 public class SqlserverHelper : IHelper 2 { 3 public void Add<T>() 4 { 5 Console.WriteLine("This is {0} Add", this.GetType().Name); 6 } 7 public void Delete<T>() 8 { 9 Console.WriteLine("This is {0} Delete", this.GetType().Name); 10 } 11 public void Update<T>() 12 { 13 Console.WriteLine("This is {0} Update", this.GetType().Name); 14 } 15 public void Query<T>() 16 { 17 Console.WriteLine("This is {0} Query", this.GetType().Name); 18 } 19 }
调用
1 Console.WriteLine("*****************************"); 2 { 3 IHelper helper = new SqlserverHelper(); 4 helper.Add<Program>(); 5 helper.Delete<Program>(); 6 helper.Update<Program>(); 7 helper.Query<Program>(); 8 } 9 Console.WriteLine("*****************************"); 10 { 11 IHelper helper = new MysqlHelper(); 12 helper.Add<Program>(); 13 helper.Delete<Program>(); 14 helper.Update<Program>(); 15 helper.Query<Program>(); 16 }
如果还要支持redis,但是redisHelper不实现IHelper接口,看看怎么扩展
1 /// <summary> 2 /// 第三方提供的 openstack servicestack 3 /// 不能修改 4 /// </summary> 5 public class RedisHelper 6 { 7 public void AddRedis<T>() 8 { 9 Console.WriteLine("This is {0} Add", this.GetType().Name); 10 } 11 public void DeleteRedis<T>() 12 { 13 Console.WriteLine("This is {0} Delete", this.GetType().Name); 14 } 15 public void UpdateRedis<T>() 16 { 17 Console.WriteLine("This is {0} Update", this.GetType().Name); 18 } 19 public void QueryRedis<T>() 20 { 21 Console.WriteLine("This is {0} Query", this.GetType().Name); 22 } 23 }
1.继承的写法
1 /// <summary> 2 /// 类适配器模式 3 /// 适配器:满足IHelper;另外直接继承RedisHelper 4 /// </summary> 5 public class RedisHelperInherit : RedisHelper, IHelper 6 { 7 public void Add<T>() 8 { 9 base.AddRedis<T>(); 10 } 11 public void Delete<T>() 12 { 13 base.DeleteRedis<T>(); 14 } 15 public void Update<T>() 16 { 17 base.UpdateRedis<T>(); 18 } 19 public void Query<T>() 20 { 21 base.QueryRedis<T>(); 22 } 23 }
2.通过组合的方式实现
1 /// <summary> 2 /// 对象适配器模式 3 /// 适配器:满足IHelper;组合一个进来 4 /// </summary> 5 public class RedisHelperCombination : IHelper 6 { 7 public RedisHelperCombination() 8 { } 9 10 /// <summary> 11 /// 1 字段属性方式组合 默认构造 特别强烈的,而且写死了 12 /// </summary> 13 private RedisHelper _RedisHelper = new RedisHelper();//组合进来 14 15 private RedisHelper _RedisHelperCtor = null; 16 /// <summary> 17 /// 2 构造函数方式组合 实例化会一定传入,但是对象可以选择 18 /// </summary> 19 /// <param name="redisHelper"></param> 20 public RedisHelperCombination(RedisHelper redisHelper) 21 { 22 this._RedisHelperCtor = redisHelper; 23 } 24 25 /// <summary> 26 /// 3 方法方式组合 对象可以选择,而且可有可无 27 /// </summary> 28 /// <param name="redisHelper"></param> 29 public void AddRedisHelper(RedisHelper redisHelper) 30 { 31 this._RedisHelperCtor = redisHelper; 32 } 33 34 35 public void Add<T>() 36 { 37 this._RedisHelper.AddRedis<T>(); 38 } 39 public void Delete<T>() 40 { 41 this._RedisHelper.DeleteRedis<T>(); 42 } 43 public void Update<T>() 44 { 45 this._RedisHelper.UpdateRedis<T>(); 46 } 47 public void Query<T>() 48 { 49 this._RedisHelper.QueryRedis<T>(); 50 } 51 }
这样就能像IHelper实现类去扩展
1 Console.WriteLine("*****************************"); 2 { 3 IHelper helper = new RedisHelperInherit(); 4 helper.Add<Program>(); 5 helper.Delete<Program>(); 6 helper.Update<Program>(); 7 helper.Query<Program>(); 8 } 9 { 10 RedisHelperInherit helper = new RedisHelperInherit(); 11 helper.AddRedis<Program>();//强侵入性 12 } 13 Console.WriteLine("*****************************"); 14 { 15 IHelper helper = new RedisHelperCombination(); 16 helper.Add<Program>(); 17 helper.Delete<Program>(); 18 helper.Update<Program>(); 19 helper.Query<Program>(); 20 }