《Head-First-设计模式》笔记9-适配器模式

  1. 定义
  2. 类图
    1. 对象适配器
    2. 类适配器
  3. 将枚举适配到迭代器
    1. 接口
    2. 适配器
  4. 适配器模式与装饰者模式区别
  5. 优点
  6. 缺点

定义

适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作。

适配器提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类(解耦)。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作。这就是适配器模式的模式动机。

适配器

类图

  • Target:目标抽象类
  • Adapter:适配器类
  • Adaptee:适配者类
  • Client:客户类

对象适配器

对象适配器

这个适配器充满着良好的 OO 设计原则:使用对象组合,以修改的接口包装被适配者,被适配者的任何子类都可以搭配着适配器使用。

类适配器

类适配器

使用了多重继承,所以在 Java 中无法使用。

和对象适配器唯一的差别就在于适配器继承了 Target 和 Adaptee。而对象适配器利用组合的方式将请求传送给被适配者。

将枚举适配到迭代器

早期 Java 的集合都实现了一个 elements() 的方法,返回一个 Enumeration。

JDK 1.2 开始使用了 Iterator 接口。

我们经常面对遗留代码,这些代码暴露出枚举器接口,但我们又希望在新的代码中只使用迭代器。想解决这个问题,看来我们需要构造一个适配器。

接口

public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove();
}

public interface Enumeration<E> {
    boolean hasMoreElements();
    E nextElement();
}

适配器

public class EnumerationIterator implements Iterator {
    Enumeration enumeration;

    public EnumerationIterator(Enumeration enumeration) {
        this.enumeration = enumeration;
    }

    @Override
    public boolean hasNext() {
        return enumeration.hasMoreElements();
    }

    @Override
    public Object next() {
        return enumeration.nextElement();
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}

适配器模式与装饰者模式区别

适配器模式:将一个类的接口,转化成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。

装饰者模式:装饰者模式用来添加一些新的功能,而维持接口不变。动态的将责任附加到对象上(因为利用组合而不是继承来实现,而组合是可以在运行时进行随机组合的)。若要扩展功能,装饰者提供了比继承更富有弹性的替代方案(同样地,通过组合可以很好的避免类暴涨,也规避了继承中的子类必须无条件继承父类所有属性的弊端)。

总结:适配器模式主要是为了接口的转换,而装饰者模式关注的是通过组合来动态的为被装饰者注入新的功能或行为(即所谓的责任)。

适配器将一个对象包装起来以改变其接口;装饰者将一个对象包装起来以增强新的行为和责任;而外观将一群对象包装起来以简化其接口。

优点

  • 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。
  • 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。
  • 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。

类适配器模式还具有如下优点:由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。

对象适配器模式还具有如下优点:一个对象适配器可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

缺点

类适配器模式的缺点如下:对于 Java、C# 等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。

对象适配器模式的缺点如下:与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:《Head-First-设计模式》笔记9-适配器模式

文章字数:1.3k

本文作者:Bin

发布时间:2018-07-13, 22:01:44

最后更新:2019-08-06, 00:07:35

原始链接:http://coolview.github.io/2018/07/13/Head-First-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E3%80%8AHead-First-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8B%E7%AC%94%E8%AE%B09-%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录