适配器模式-Adapter

适配器模式

动机

在软件系统中,由于应用环境的变化, 常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。

意图

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

结构

adapter.png

要点

  • Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况” ,在遗留代码复用、类库迁移等方面非常有用。
  • GoF 23 定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
  • Adapter模式可以实现的非常灵活,不必拘泥于Gof23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。
  • Adapter模式本身要求我们尽可能地使用“面向接口的编程”风格,这样才能在后期很方便地适配。

    代码示例

  • ArrayList栈实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    //栈接口
    public interface IStack
    {
    void Push(object item);
    object Pop();
    }
    //适配器
    public class Adapter:IStack
    {
    //被适配对象
    ArrayList adaptee;
    public Adapter()
    {
    adaptee = new ArrayList();
    }
    public void Push(object item)
    {
    adaptee.addItem(item);
    }
    public object Pop()
    {
    return adaptee.removeAt(adaptee.count -1);
    }
    }
  • 结构图对应实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    //现有类
    public class Adaptee
    {
    public void SpecificRequest1()
    {
    ...
    }
    public void SpecificRequest2()
    {
    ...
    }
    }
    //新系统接口
    public interface ITarget
    {
    public abstract void Request();
    }
    //新系统
    class Sys
    {
    public void Process(ITarget target)
    {
    target.Request();
    }
    }
    //新系统适配
    public class Adapter:ITarget
    {
    Adaptee adaptee = new Adaptee();
    public override void Request()
    {
    adaptee.SpecificRequest1();
    adaptee.SpecificRequest2();
    }
    }