4 Adapter模式
4.1 概述
Adapter模式又叫适配器模式,顾名思义,这个模式就是把一个不能用的东西“适配”成可以用的东西。
4.2 设计
那么是如何“适配”的呢?比如,东西A想使用东西B,但是A没有能力(没法)使用B,怎么办?A就让东西C帮忙,A通过C就可以用B了。C如何帮忙呢?C一边可以通过一个“手柄”让A握住,A一用力,C就在另一边握住B的“手柄”,使用B。这样A就可以间接的使用到B了。说的这么多,搞的糊里糊涂的,其实A、B就好像是两节水管,C就好像是连接水管的接头。
4.3 实现
UML图:
示例代码为:
1using System;
2
3namespace Example
4{
5 /// <summary>
6 /// 示例
7 /// </summary>
8 class Example
9 {
10 /// <summary>
11 /// 应用程序的主入口点。
12 /// </summary>
13 [STAThread]
14 static void Main(string[] args)
15 {
16 Hosepipe pipe = new BigHosepipe() ;
17 pipe.Influx() ;
18 pipe.Effuse() ;
19 }
20 /// <summary>
21 /// 水
22 /// </summary>
23 public class Water
24 {
25 public Water() {}
26 }
27 /// <summary>
28 /// 大水管
29 /// </summary>
30 /// <remarks>
31 /// 程序员A编写
32 /// 测试员C测试
33 /// </remarks>
34 public class BigPipe
35 {
36 public Water In()
37 {
38 Console.WriteLine( "流入水" ) ;
39 return new Water() ;
40 }
41 public void Out()
42 {
43 Console.WriteLine( "水流出" ) ;
44 }
45 }
46 /// <summary>
47 /// 水管接口
48 /// </summary>
49 interface Hosepipe
50 {
51 /// <summary>
52 /// 进水
53 /// </summary>
54 /// <returns>水</returns>
55 Water Influx() ;
56 /// <summary>
57 /// 出水
58 /// </summary>
59 void Effuse() ;
60 }
61 /// <summary>
62 /// 小水管
63 /// </summary>
64 public class SmallHosepipe : Hosepipe
65 {
66 #region Hosepipe 成员
67
68 public Water Influx()
69 {
70 // TODO: 添加 SmallHosepipe.Influx 实现
71 return null;
72 }
73
74 public void Effuse()
75 {
76 // TODO: 添加 SmallHosepipe.Effuse 实现
77 }
78
79 #endregion
80 }
81 /// <summary>
82 /// 中水管
83 /// </summary>
84 public class MiddleHosepipe : Hosepipe
85 {
86 #region Hosepipe 成员
87
88 public Water Influx()
89 {
90 // TODO: 添加 MiddleHosepipe.Influx 实现
91 return null;
92 }
93
94 public void Effuse()
95 {
96 // TODO: 添加 MiddleHosepipe.Effuse 实现
97 }
98
99 #endregion
100 }
101 /// <summary>
102 /// 大水管
103 /// </summary>
104 /// <remarks>
105 /// 当准备写大水管的进出水方法时,发现程序A已经写过同样功能的代码
106 /// 但是A命名时并没有征求你的意见以及你也没有要求
107 /// 所以只要采用Adapter模式,使用A已编好的功能
108 /// </remarks>
109 public class BigHosepipe : Hosepipe
110 {
111 private BigPipe bigPipe = new BigPipe() ;
112 #region Hosepipe 成员
113 public Water Influx()
114 {
115 return bigPipe.In() ;
116 }
117 public void Effuse()
118 {
119 bigPipe.Out() ;
120 }
121 #endregion
122 }
123 }
124}
125
2
3namespace Example
4{
5 /// <summary>
6 /// 示例
7 /// </summary>
8 class Example
9 {
10 /// <summary>
11 /// 应用程序的主入口点。
12 /// </summary>
13 [STAThread]
14 static void Main(string[] args)
15 {
16 Hosepipe pipe = new BigHosepipe() ;
17 pipe.Influx() ;
18 pipe.Effuse() ;
19 }
20 /// <summary>
21 /// 水
22 /// </summary>
23 public class Water
24 {
25 public Water() {}
26 }
27 /// <summary>
28 /// 大水管
29 /// </summary>
30 /// <remarks>
31 /// 程序员A编写
32 /// 测试员C测试
33 /// </remarks>
34 public class BigPipe
35 {
36 public Water In()
37 {
38 Console.WriteLine( "流入水" ) ;
39 return new Water() ;
40 }
41 public void Out()
42 {
43 Console.WriteLine( "水流出" ) ;
44 }
45 }
46 /// <summary>
47 /// 水管接口
48 /// </summary>
49 interface Hosepipe
50 {
51 /// <summary>
52 /// 进水
53 /// </summary>
54 /// <returns>水</returns>
55 Water Influx() ;
56 /// <summary>
57 /// 出水
58 /// </summary>
59 void Effuse() ;
60 }
61 /// <summary>
62 /// 小水管
63 /// </summary>
64 public class SmallHosepipe : Hosepipe
65 {
66 #region Hosepipe 成员
67
68 public Water Influx()
69 {
70 // TODO: 添加 SmallHosepipe.Influx 实现
71 return null;
72 }
73
74 public void Effuse()
75 {
76 // TODO: 添加 SmallHosepipe.Effuse 实现
77 }
78
79 #endregion
80 }
81 /// <summary>
82 /// 中水管
83 /// </summary>
84 public class MiddleHosepipe : Hosepipe
85 {
86 #region Hosepipe 成员
87
88 public Water Influx()
89 {
90 // TODO: 添加 MiddleHosepipe.Influx 实现
91 return null;
92 }
93
94 public void Effuse()
95 {
96 // TODO: 添加 MiddleHosepipe.Effuse 实现
97 }
98
99 #endregion
100 }
101 /// <summary>
102 /// 大水管
103 /// </summary>
104 /// <remarks>
105 /// 当准备写大水管的进出水方法时,发现程序A已经写过同样功能的代码
106 /// 但是A命名时并没有征求你的意见以及你也没有要求
107 /// 所以只要采用Adapter模式,使用A已编好的功能
108 /// </remarks>
109 public class BigHosepipe : Hosepipe
110 {
111 private BigPipe bigPipe = new BigPipe() ;
112 #region Hosepipe 成员
113 public Water Influx()
114 {
115 return bigPipe.In() ;
116 }
117 public void Effuse()
118 {
119 bigPipe.Out() ;
120 }
121 #endregion
122 }
123 }
124}
125