.net设计模式-适配器模式

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                 }

猜你喜欢

转载自www.cnblogs.com/Spinoza/p/11462159.html