适配器模式的功能是将一个接口转换成用户希望的另一个接口,使接口不兼容的类可以一起工作,目的是包装一个类使其可以达到目标的要求。
在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。
适配器模式中的几个核心的角色:
Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。
Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
试想一种场景,你的项目中 有一个类的 一个方法已经在一些场景中使用了,现在有一个场景是在这个类的这个方法上需要增加一些功能来满足新的需求,这个时候,我们是不能更改已经在使用的类的方法的,这样怕会对现有的功能产生影响。
我们可以通过新增一个类来继承这个类,在新的类中对这个进行一层包装达到我们要的逻辑。
或者我们可以在新增的类中维护原有类的引用,在新增的类的方法中对原有类方法的逻辑进行一次包装。
上面两种方法是适配器模式的两种实现:1 通过继承来实现 2 通过组合来实现
下面来看看实现1:代码如下所示
// 需要被适配的类 public class Adaptee { public void adapteeRequest() { System.out.println("被适配者的方法"); } }
public interface Target { // 需要执行的目标方法 void request(); }
public class Adapter extends Adaptee implements Target{ //对于用户来说 要执行的是目标方法中的request 方法 request 方法 在被适配类的方法的基础上相应增强 // 所以可以通过继承 Adaptee 类 和 实现Target接口 来实现这个目标 @Override public void request() { //... 一些增强操作 super.adapteeRequest(); //... 一些增强操作 } }
通过这种方式 不需要对 原先的 Adaptee 的方法进行修改,即可包装出新的方法来扩展新的功能。使得被适配的类可以继续在项目中使用不受影响
方式2:其实就是通过适配器类的组合方式来实现的。通过组合,拓展原有类的方式来达到适配的目的。
public interface Target { // 需要执行的目标方法 void request(); }
// 需要被适配的类 public class Adaptee { public void adapteeRequest() { System.out.println("被适配者的方法"); } }
public class Adapter implements Target{ // 通过组合的方式来实现包装需要被适配的类 Adaptee adaptee=new Adaptee(); @Override public void request() { //... 一些增强操作 adaptee.adapteeRequest(); //... 一些增强操作 } }
以上两种方式是适配器模式的实现方式。