[转载]设计模式——Adapter Pattern(适配器模式) – 探索、挖掘、研究、致用、创新 – 博客园.
本文通过对象适配器模式模拟一个翻译人员或翻译系统的工作流程,希望能体现出Adapter适配器模式的精髓。
先看本次模拟的UML图
源角色(Adaptee)
04 |
public abstract class Languages |
06 |
public virtual string Translate( string languageText) |
12 |
public class Chinese : Languages |
17 |
/// <param name="chinese"></param> |
18 |
/// <returns></returns> |
19 |
public override string Translate( string englishText) |
26 |
public class English : Languages |
31 |
/// <param name="chinese"></param> |
32 |
/// <returns></returns> |
33 |
public override string Translate( string chineseText) |
目标角色(Target)
4 |
public interface ITarget |
6 |
string Translate( string languageText); |
适配器角色(Adapter)
04 |
public class Translator : ITarget |
06 |
private Languages _language; |
07 |
public Translator(Languages language) |
09 |
this ._language = language; |
15 |
/// <param name="language"></param> |
16 |
/// <returns></returns> |
17 |
public string Translate( string languageText) |
19 |
string result = this ._language.Translate(languageText); |
20 |
Console.WriteLine( "翻译完成。" ); |
客户端调用
1 |
ITarget target1 = new Translator( new English()); |
2 |
string english = target1.Translate( "Roy Ming" ); |
3 |
Console.WriteLine( "翻译结果:" + english); |
5 |
ITarget target2 = new Translator( new Chinese()); |
6 |
string chinese = target2.Translate( "罗伊 明" ); |
7 |
Console.WriteLine( "翻译结果:" + chinese); |
适配器模式简介
将一个类的接口转换为客户希望的另外一个接口。Adapter模式使原本由于接口不兼容而不能在一起的工作的类可以一起工作。—源自<设计模式>
适配器模式(Adatper Patterns)分为类适配器模式、对象适配器模式。
类适配器模式的实现方式通过多重继承。如下图
而对象适配器模式依赖于一个对象(适配对象)包含另一个对象(被适配对象)。如下图
Adapter模式与Facade模式看起来确实比较类似。他们都是通过封装的手法展示的,不过他们的本质还是有很多的区别存在的。
比较一下
- Adapter模式和Facade模式都存在既有的类。
- Facade模式所针对的是简化接口,而Adapter模式所针对的是将一个已有的接口转换成另一个接口。
- Adapter模式必须遵循某个特定的接口进行设计,而Facade模式无需如此。
- Facade模式无需多态行为,Adapter模式在某些复杂的设计中将会使用到多态行为。
Adapter模式涉及到的角色
- 目标角色(Target):对客户提供的接口,必须为接口。
- 源角色(Adaptee):带适配的源(一般为类Class)。
- 适配器角色(Adapter):将源(Adaptee)接口适配为目标接口。
适配器模式使用场景:
- 需要使用原有的接口,而此接口不符合系统的需要。
- 想要建立一个可以重复使用的接口,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
- 对象适配器而言在设计中,需要改变多个现有的源接口,类适配器模式要针对每一个源接口做一个适配器,而显然不实际。
小结
适配器模式是一个很常用的模式,它将一个(或多个)类的接口转换成我们需要类所具备的另一个接口,它的实现方式是:创建一个所需接口的新类,然后包装原有类的方法,这样实际上就包含了被适配的对象。
源码下载