设计模式(六)———适配器模式(Adatpter Method):加个“适配器”以便于复用

设计模式(六)———适配器模式(Adatpter Method):加个“适配器”以便于复用

Scroll Down

Intent

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

应用实例

  • 美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。
  • JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。
  • JAVA 中的 jdbc。

使用场景

有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

优点

  • 可以让任何两个没有关联的类一起运行。
  • 提高了类的复用。
  • 增加了类的透明度。
  • 灵活性好。

缺点

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
  • 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

Class Diagram

image.png

Target(对象)

Target角色负责定义所需的方法。

Client(使用者)

Client角色负责使用Target角色所定义的方法进行具体处理。

Adaptee(被适配)

Adaptee是一个持有既定方法的角色

Adapter(适配器)

Adapter模式的主人公,使用Adaptee角色的方法来满足Target角色的需求,这是Adapter模式的目的,也是Adaptee角色的作用

Implementation

Adapter模式有以下两种模式

  • 类适配器模式(使用继承的适配器)
  • 对象适配器模式(使用委托的适配器)

对象适配器模式

public class Target{
   public abstract void Request() {
      System.out.println("普通请求");      
   }
}
public class Adaptee{
   public abstract void SpecificRequest() {
      System.out.println("特殊请求");      
   }
}
public class Adapter extends Target{

   private Adaptee adaptee= new Adaptee();

   public abstract void Request() {
      adaptee.SpecificRequest();   
   }
}
   public static void main(String[] args) {
	Target target=new Target();
	target.Request();
   }

输出结果:

特殊请求

类适配器模式

public interface Target{
   public void Request();
}
public class Adaptee{
   public abstract void SpecificRequest() {
      System.out.println("特殊请求");      
   }
}
public class Adapter extends Adapteeimplement Target{
   public void Request() {
      super.SpecificRequest();   
   }
}
   public static void main(String[] args) {
	Target target=new Target();
	target.Request();
   }

输出结果:

特殊请求