设计模式:适配器模式(Adapter Pattern) 明

作者:TerryLee  创建于:2005-12-09 出处: http://terrylee.cnblogs.com/archive/2006/02/18/333000.html  创建于:2013-02-28

结构图


1 类适配器模式

2 对象适配器模式

意图


将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适用性


  • 你想使用一个已经存在的类,而它的接口不符合你的需求。
  • 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
  • (仅适用于对象A d a p t e r )你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。  

实现代码


1 类适配器代码

 1 using System;
 2 public abstract class LogAdaptee
 3 {
 4     public abstract void WriteLog();
 5 }
 6 public class DatabaseLog : LogAdaptee
 7 {
 8     public override void WriteLog()
 9     {
10         Console.WriteLine("Called Database WriteLog Method");
11     }
12 }
13 public class FileLog : LogAdaptee
14 {
15     public override void WriteLog()
16     {
17         Console.WriteLine("Called File WriteLog Method");
18     }
19 }
20 public interface ILogTarget
21 {
22     void Write();
23 }
24 public class DatabaseLogAdapter : DatabaseLog, ILogTarget
25 {
26     public void Write()
27     {
28         WriteLog();
29     }
30 }
31 public class FileLogAdapter : FileLog, ILogTarget
32 {
33     public void Write()
34     {
35         this.WriteLog();
36     }
37 }
38 public class App
39 {
40     public static void Main()
41     {
42         ILogTarget dbLog = new DatabaseLogAdapter();
43         dbLog.Write();
44         ILogTarget fileLog = new FileLogAdapter();
45         fileLog.Write();
46         Console.Read();    
47     }
48 }

2 对象适配器代码

 1 using System;
 2 public abstract class LogAdaptee
 3 {
 4     public abstract void WriteLog();
 5 }
 6 public class DatabaseLog : LogAdaptee
 7 {
 8     public override void WriteLog()
 9     {
10         Console.WriteLine("Called Database WriteLog Method");
11     }
12 }
13 public class FileLog : LogAdaptee
14 {
15     public override void WriteLog()
16     {
17         Console.WriteLine("Called File WriteLog Method");
18     }
19 }
20 public interface ILogTarget
21 {
22     void Write();
23 }
24 public class LogAdapter : ILogTarget
25 {
26     private LogAdaptee _adaptee;
27     public LogAdapter(LogAdaptee adaptee)
28     {
29         this._adaptee = adaptee;
30     }
31     public void Write()
32     {
33         _adaptee.WriteLog();
34     }
35 }
36 public class App
37 {
38     public static void Main()
39     {
40         ILogTarget dbLog = new LogAdapter(new DatabaseLog());
41         dbLog.Write();
42         ILogTarget fileLog = new LogAdapter(new FileLog());
43         fileLog.Write();
44         Console.Read();
45     }
46 }

可以总结出,在类适配方式中,我们得到的适配器类DatabaseLogAdapter和FileLogAdapter具有它所继承的父类的所有的行为,同时也具有接口ILogTarget的所有行为,这样其实是违背了面向对象设计原则中的类的单一职责原则,而对象适配器则更符合面向对象的精神。

实现要点


1.Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。

2.Adapter模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
3.Adapter模式的实现可以非常的灵活,不必拘泥于GOF23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。
4.Adapter模式本身要求我们尽可能地使用“面向接口的编程”风格,这样才能在后期很方便的适配。

效果


对于类适配器:

1.用一个具体的Adapter类对Adaptee和Taget进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。
2.使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
3.仅仅引入了一个对象,并不需要额外的指针一间接得到Adaptee.

对于对象适配器:

1.允许一个Adapter与多个Adaptee,即Adaptee本身以及它的所有子类(如果有子类的话)同时工作。Adapter也可以一次给所有的Adaptee添加功能。
2.使得重定义Adaptee的行为比较困难。这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。

 

原文地址:https://www.cnblogs.com/Ming8006/p/2936920.html