适配器模式负责在用户需求接口与不同的实现类之间的转换。如果客户需要某个类的服务而这个服务是这个类用不同的的接口提供的,那么就可以用适配器模式为客户提供一个期望的接口。分为两种情况:
1、类适配器,模式原型的实现方法是,定义或获取一个需求的接口,包含一个或多个需求的方法,定义一个适配器类,继承于接口和实现接口需求的外部类,将客户的需求传递给实现需求的外部类,即达到了本模式的要求。
这是摘自吕老师的大作的代码,够精典的。
2、对象适配器,如果没有定义一个接口,我们也可以使用适配器模式,这就是用对象适配器模式,定义一个类,定义一个可重写的虚方法,实现一个继承于需求类的适配器类,在这个类内部实例化一个能满足需求类的外部类,重写需求方法,将外部类方法传递给需求方法。
适配器模式加大对现在的代码的重用。通过适配器能在不同的接口之间实现翻译的功能。同时对于没有实现接口的需求,也能通过对象适配器建立一个转交需求的作用。
1、类适配器,模式原型的实现方法是,定义或获取一个需求的接口,包含一个或多个需求的方法,定义一个适配器类,继承于接口和实现接口需求的外部类,将客户的需求传递给实现需求的外部类,即达到了本模式的要求。
这是摘自吕老师的大作的代码,够精典的。
1
using System;
2![](/Images/OutliningIndicators/None.gif)
3
// "ITarget"
4
interface ITarget
5
{
6
// Methods
7
void Request();
8
}
9![](/Images/OutliningIndicators/None.gif)
10
// "Adaptee"
11
class Adaptee
12
{
13
// Methods
14
public void SpecificRequest()
15
{
16
Console.WriteLine("Called SpecificRequest()" );
17
}
18
}
19![](/Images/OutliningIndicators/None.gif)
20
// "Adapter"
21
class Adapter : Adaptee, ITarget
22
{
23
// Implements ITarget interface
24
public void Request()
25
{
26
// Possibly do some data manipulation
27
// and then call SpecificRequest
28
this.SpecificRequest();
29
}
30
}
31![](/Images/OutliningIndicators/None.gif)
32
/**//// <summary>
33
/// Client test
34
/// </summary>
35
public class Client
36
{
37
public static void Main(string[] args)
38
{
39
// Create adapter and place a request
40
ITarget t = new Adapter();
41
t.Request();
42
}
43
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
18
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
30
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
31
![](/Images/OutliningIndicators/None.gif)
32
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
35
![](/Images/OutliningIndicators/None.gif)
36
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
43
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
2、对象适配器,如果没有定义一个接口,我们也可以使用适配器模式,这就是用对象适配器模式,定义一个类,定义一个可重写的虚方法,实现一个继承于需求类的适配器类,在这个类内部实例化一个能满足需求类的外部类,重写需求方法,将外部类方法传递给需求方法。
1
using System;
2![](/Images/OutliningIndicators/None.gif)
3
// "Target"
4
class Target
5
{
6
// Methods
7
virtual public void Request()
8
{
9
// Normal implementation goes here
10
}
11
}
12![](/Images/OutliningIndicators/None.gif)
13
// "Adapter"
14
class Adapter : Target
15
{
16
// Fields
17
private Adaptee adaptee = new Adaptee();
18![](/Images/OutliningIndicators/InBlock.gif)
19
// Methods
20
override public void Request()
21
{
22
// Possibly do some data manipulation
23
// and then call SpecificRequest
24
adaptee.SpecificRequest();
25
}
26
}
27![](/Images/OutliningIndicators/None.gif)
28
// "Adaptee"
29
class Adaptee
30
{
31
// Methods
32
public void SpecificRequest()
33
{
34
Console.WriteLine("Called SpecificRequest()" );
35
}
36
}
37![](/Images/OutliningIndicators/None.gif)
38
/**//// <summary>
39
/// Client test
40
/// </summary>
41
public class Client
42
{
43
public static void Main(string[] args)
44
{
45
// Create adapter and place a request
46
Target t = new Adapter();
47
t.Request();
48
}
49
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
11
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
26
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/None.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
36
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
37
![](/Images/OutliningIndicators/None.gif)
38
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
41
![](/Images/OutliningIndicators/None.gif)
42
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
49
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
适配器模式加大对现在的代码的重用。通过适配器能在不同的接口之间实现翻译的功能。同时对于没有实现接口的需求,也能通过对象适配器建立一个转交需求的作用。