介绍

适配器模式是把一个类的接口变换成客户端所能接受的另外一种接口,使两个不同接口的能一起使用。
适配器模式需要三种角色:

  • 目标接口:要转换的所期待的接口;
  • 源角色:需要适配的接口;
  • 适配器:将源接口适配成目标接口,继承源接口,实现目标接口;

Adapter Pattern:Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn’t otherwise because of incompatible interface.

适配器模式的别名为包装器(Wrapper)模式,它既可以作为类结构型模式,也可以作为对象结构型模式。在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合。不画类图了…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Adapter : Target
{
private Adaptee adaptee; //维持一个对适配者对象的引用

public Adapter(Adaptee adaptee)
{
this.adaptee = adaptee;
}

public void Request()
{
adaptee.SpecificRequest();//转发调用
}
}

在java io中就使用的适配器模式。比如inputStreamReader继承Reader接口,在创建对象时需要在构造函数传入inputStream实例,InputStreamReader的作用就是将InputStream适配到Reader中,根据上面的例子可以模拟出来。

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

  缺点:

  • 一次最多只能适配一个适配者类,不能同时适配多个适配者。
  • 目标抽象类只能为接口,不能为类,其使用有一定的局限性。
    适用场景:
    系统需要使用一些现有的类,而这些类的接口不符合系统的需要,甚至没有这些类的源代码

  创建一个可以重复使用的类,用于和一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作