适配器模式(Adapter pattern),又叫变压器模式,是将一个类的接口变换成客户端所期待的另一种接口,从而使原本因不匹配而无法一起工作的两个类一起工作。适配器模式有类适配器模式和对象适配器模式两种方式。
适配器模式主要包含以下角色:
目标角色(Target):客户端所期待的角色,通常为抽象类或接口。
源角色(Adaptee): 需要被适配的接口,可以是具体的类、也可以是抽象类或接口。
适配器角色(Adapter):适配器,把源接口转化为目标接口。
下面举一个生活中的例子,以便更好地理解适配器模式。我们生活用电是220V,某小电器的额定电压为22V,此时需要一个变压器。其中:
Target:用户期待22V电源;
Adaptee:当前能提供的220V电源;
Adapter:变压器。
先看类适配器:适配器角色Adapter扩展了Adaptee,同时又实现了目标(Target)接口。
源代码
Target.java (客户端期待的,提供22V电源)
public interface Target { public int get22V(); }
Adaptee.java (提供220V电源)
public class Adaptee { public int get220V() { System.out.println("Adaptee-提供了220V的电源"); return 220; } }
Adapter.java (变压器,将220V转换为22V)
public class Adapter extends Adaptee implements Target { @Override public int get22V() { int resource = get220V(); System.out.println("Adapter-将220V转化为22V"); int target = resource / 10; System.out.println("Adapter-得到22V电源"); return target; } }
Client.java (客户端)
public class Client { public static void main(String[] args) { Target target = new Adapter(); int value = target.get22V(); System.out.println("Client-使用的电源是:" + value + "V"); } }
执行结果:
Adaptee-提供了220V的电源 Adapter-将220V转化为22V Adapter-得到22V电源 Client-使用的电源是:22V
再看对象适配器:对象适配器与类适配器的区别是,adapter不去继承adaptee,而是使用委派关系,依赖adaptee。
源代码:
Target.java
public interface Target { public int get22V(); }
Adaptee.java
public class Adaptee { public int get220V() { System.out.println("Adaptee-提供了220V的电源"); return 220; } }
Adapter.java
public class Adapter implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public int get22V() { int resource = adaptee.get220V(); System.out.println("Adapter-将220V转化为22V"); int target = resource / 10; System.out.println("Adapter-得到22V电源"); return target; } }
Client.java
public class Client { public static void main(String[] args) { Adaptee adaptee = new Adaptee(); Target target = new Adapter(adaptee); int value = target.get22V(); System.out.println("Client-使用的电源是:" + value + "V"); } }
执行结果:
Adaptee-提供了220V的电源 Adapter-将220V转化为22V Adapter-得到22V电源 Client-使用的电源是:22V
总结
建议尽量使用对象适配器模式,少用泛化关系,多用聚合、依赖关系,降低耦合度。适配器模式具有很好的复用性(可以利用现有的、不匹配的接口),适配器还具有很好的扩展性(在适配器中增添自己的逻辑)。但是适配器如果使用太多,那将是灾难性的,不如直接重构。
友情提示:
源码下载地址(GitHub):点此下载本文相关源代码
整个工程为Maven工程,对Maven不熟悉的同学可以查看我的另一篇博客Maven入门