适配器模式
Adapter Pattern
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
参考https://blog.csdn.net/cui_yonghua/article/details/90910093
定义一个包装类,用于包装不兼容接口的对象:
- 包装类 = 适配器Adapter;
- 被包装对象 = 适配者Adaptee = 被适配的类
使用场景:
系统需要复用现有类,而该类的接口不符合系统的需求,可以使用适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
多个组件功能类似,但接口不统一且可能会经常切换时,可使用适配器模式,使得客户端可以以统一的接口使用它们
需要一个统一的输出接口,但是输入类型却不可预知。
主要作用:把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
类的适配器和对象的适配器
- 灵活使用时:选择对象的适配器模式,类适配器使用对象继承的方式,是静态的定义方式;而对象适配器使用对象组合的方式,是动态组合的方式。
- 需要同时配源类和其子类:选择对象的适配器,对于对象适配器,一个适配器可以把多种不同的源适配到同一个目标。
- 需要重新定义Adaptee的部分行为:选择类适配器。对于类适配器,适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法。对于对象适配器,要重定义Adaptee的行为比较困难。
- 仅仅希望使用方便时:选择类适配器,对于类适配器,仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee。对于对象适配器,需要额外的引用来间接得到Adaptee。
-
新建一个需要适配的类 Adaptee
package com.ung.designMode.adapter; /** * @author: wenyi * @create: 2022/9/19 * @Description: 需要被适配的类 * 有自己的方法,跟目标接口没有直接关系 */ public class Adaptee { public void request() { System.out.println("执行被适配的类的方法"); } }
-
新建需要给适配的类 添加的接口
package com.ung.designMode.adapter; /** * @author: wenyi * @create: 2022/9/19 * @Description: 适配器模式的 目标接口 */ public interface Target { void handleReq(); }
-
创建适配类,类适配方式
package com.ung.designMode.adapter; /** * @author: wenyi * @create: 2022/9/19 * @Description: 适配 Adaptee 的类 * 通过继承 Adaptee 来适配是类适配器的方式 * 实现了Target接口,与Target有关联了 */ public class AdapterClass extends Adaptee implements Target { @Override public void handleReq() { super.request(); } }
-
创建适配类 对象适配方式
package com.ung.designMode.adapter; /** * @author: wenyi * @create: 2022/9/19 * @Description: 适配 Adaptee 的类 * 通过将 Adaptee 作为成员变量 来适配是对象适配器的方式 * 实现了Target接口,与Target有关联了 */ public class AdapterObject implements Target { private Adaptee adaptee; public AdapterObject(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void handleReq() { adaptee.request(); } }
-
测试
package com.ung.designMode.adapter; import org.junit.Test; public class AdapteeTest { @Test public void request() { /*类适配*/ Target targetClass = new AdapterClass(); targetClass.handleReq(); /*对象适配*/ Adaptee adaptee = new Adaptee(); Target targetObj = new AdapterObject(adaptee); targetObj.handleReq(); } }
总之,自己理解的就是有一个需要被适配的类A,需要实现某个接口B,一个B的实现类来通过继承A或将A作为成员变量来进行适配A,的方式
意思是要给类A适配接口B,不直接修改A,而是找个第三方,既有A的方法,也实现了B接口;