[转载]设计模式——Adapter Pattern(适配器模式)

baacloud免费翻墙vpn注册使用

[转载]设计模式——Adapter Pattern(适配器模式) – 探索、挖掘、研究、致用、创新 – 博客园.

本文通过对象适配器模式模拟一个翻译人员或翻译系统的工作流程,希望能体现出Adapter适配器模式的精髓。

先看本次模拟的UML图

源角色(Adaptee)

01 /// <summary>
02 /// 源角色(Adaptee)
03 /// </summary>
04 public abstract class Languages
05 {
06 public virtual string Translate(string languageText)
07 {
08 return "暂不支持这种语言。";
09 }
10 }
11
12 public class Chinese : Languages
13 {
14 /// <summary>
15 /// 翻译为英文
16 /// </summary>
17 /// <param name="chinese"></param>
18 /// <returns></returns>
19 public override string Translate(string englishText)
20 {
21 //翻译过程...
22 return "罗伊 明";
23 }
24 }
25
26 public class English : Languages
27 {
28 /// <summary>
29 /// 翻译为英文
30 /// </summary>
31 /// <param name="chinese"></param>
32 /// <returns></returns>
33 public override string Translate(string chineseText)
34 {
35 //翻译过程...
36 return "Roy Ming";
37 }
38 }

目标角色(Target)

1 /// <summary>
2 /// 目标角色(Target)
3 /// </summary>
4 public interface ITarget
5 {
6 string Translate(string languageText);
7 }

适配器角色(Adapter)

01 /// <summary>
02 /// 适配器角色(Adapter)
03 /// </summary>
04 public class Translator : ITarget
05 {
06 private Languages _language;
07 public Translator(Languages language)
08 {
09 this._language = language;
10 }
11
12 /// <summary>
13 ///
14 /// </summary>
15 /// <param name="language"></param>
16 /// <returns></returns>
17 public string Translate(string languageText)
18 {
19 string result = this._language.Translate(languageText);
20 Console.WriteLine("翻译完成。");
21 return result;
22 }
23 }

客户端调用

1 ITarget target1 = new Translator(new English());
2 string english = target1.Translate("Roy Ming");
3 Console.WriteLine("翻译结果:" + english);
4
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模式涉及到的角色

  1. 目标角色(Target):对客户提供的接口,必须为接口。
  2. 源角色(Adaptee):带适配的源(一般为类Class)。
  3. 适配器角色(Adapter):将源(Adaptee)接口适配为目标接口。

适配器模式使用场景:

  1. 需要使用原有的接口,而此接口不符合系统的需要。
  2. 想要建立一个可以重复使用的接口,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
  3. 对象适配器而言在设计中,需要改变多个现有的源接口,类适配器模式要针对每一个源接口做一个适配器,而显然不实际。

小结

适配器模式是一个很常用的模式,它将一个(或多个)类的接口转换成我们需要类所具备的另一个接口,它的实现方式是:创建一个所需接口的新类,然后包装原有类的方法,这样实际上就包含了被适配的对象。

源码下载

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏