适配器模式
引入问题
相信大家出国旅游的时候都会碰到一个问题,在很多国家,我们带去的手机电脑等充电器都无法使用,因为这些国家使用的插座接口并不适用于我们平时使用的国标插头。这个时候,我们一般会通过添加一个插头转换器,将不适用于国标插头的插座接口装换成国标插头能使用的插座接口。这就是适配器的工作,它位于实际情况和需求之间,填补两者的差异。
而在我们平时的开发中,经常也会出现类似的问题。即我们想要使用一个已经存在的类,但是该类不符合接口的需求。
介绍
适配器模式将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容
而不能一起工作的那些类可以一起工作。
适配器模式下主要有以下四种角色:
- Target(对象)
该角色负责定义Client所需的接口。 - Client(请求者)
该角色负责使用Target角色所定义的方法进行具体处理。 - Adaptee(被适配对象)
该角色是一个持有既定接口的角色,该接口需要被适配。 - Adapter(适配器)
该角色是适配器模式的主角,负责对Adaptee的接口和Target接口进行适配。
适配器模式有以下两种实现方式:
- 类适配器模式
- 对象适配器模式
示例程序
类适配器模式
Adaptee类
public class Adaptee { public void method() { System.out.println("执行被适配接口..."); } }
Target接口
public interface Target { public void targetMethod(); }
Adapter类
public class Adapter extends Adaptee implements Target { public void targetMethod() { super.method(); } }
Client类
public class Client { public static void main(String[] args) { Target target = new Adapter(); target.targetMethod(); } }
运行结果
执行被适配接口...
对象适配器模式
Adaptee类
public class Adaptee { public void method() { System.out.println("执行被适配接口..."); } }
Target接口
public interface Target { public void targetMethod(); }
Adapter类
public class Adapter implements Target { Adaptee adaptee = new Adaptee(); public void targetMethod() { adaptee.method(); } }
Client类
public class Client { public static void main(String[] args) { Target target = new Adapter(); target.targetMethod(); } }
运行结果
执行被适配接口...
适配器模式总结
- 优点:
1)使用适配器模式,代码的耦合度较低。
2)只要适配器类编写得当,随意两个没有关系的类都可以在一起运行。
3)灵活、可复用性高,适配器随时可删可改,不会对既存的逻辑产生影响。