主要分为三类:类适配器模式、对象适配器模式、接口适配器模式

工作原理

适配器模式:将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容
从用户的角度看不到被适配者,是解耦的
用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法
用户收到反馈结果,感觉只是和目标接口交互

类适配器

例如,现在有一个提供5V电压充电的接口

  1. // 使用5V充电
  2. public interface Charge5V {
  3. void charging();
  4. }

充电宝类实现了该接口

  1. // 充电宝
  2. public class MobilePower implements Charge5V {
  3. @Override
  4. public void charging() {
  5. System.out.println("使用充电宝给手机充电(5V)");
  6. }
  7. }

然后手机可以充电

  1. // 手机
  2. public class Phone {
  3. public void charge(Charge5V c) {
  4. c.charging();
  5. }
  6. public static void main(String[] args) {
  7. Phone phone = new Phone();
  8. MobilePower mobilePower = new MobilePower();
  9. phone.charge(mobilePower);
  10. }
  11. }

现在有一个插座,输出220V电压

  1. // 插座
  2. public class Socket{
  3. public void chargingWith220V() {
  4. System.out.println("使用插座直接充电(220V)");
  5. }
  6. }

插座类也想给手机充电,但是因为接口类型不匹配,不能充电
image.png

现在需要一个适配器类:充电器

  1. // 充电器
  2. public class ChargerAdapter extends Socket implements Charge5V {
  3. @Override
  4. public void charging() {
  5. chargingWith220V();
  6. System.out.println("转化为5V");
  7. }
  8. }

然后插座通过充电器给手机充电

  1. // 手机
  2. public class Phone {
  3. public void charge(Charge5V c) {
  4. c.charging();
  5. }
  6. public static void main(String[] args) {
  7. Phone phone = new Phone();
  8. ChargerAdapter chargerAdapter = new ChargerAdapter();
  9. phone.charge(chargerAdapter);
  10. }
  11. }
  12. 输出:
  13. 使用插座直接充电(220V
  14. 用适配器转换为5V

对象适配器

简介:

  • 基本思路和类适配器相同,只是将Adapter类做修改,不是继承src类,而是持有src类的实例,以解决兼容性的问题。
  • 根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系
  • 对象适配器模式是适配器模式中常用的一种
  • 使用成本更低,更灵活

仍然使用上面手机充电的例子,修改适配器:

  1. // 充电器
  2. public class ChargerAdapter implements Charge5V {
  3. private Socket socket;
  4. public ChargerAdapter(Socket socket) {
  5. this.socket = socket;
  6. }
  7. public void charging() {
  8. socket.chargingWith220V();
  9. System.out.println("转化为5V");
  10. }
  11. }

在Phone调用:

  1. // 手机
  2. public class Phone {
  3. public void charge(Charge5V c) {
  4. c.charging();
  5. }
  6. public static void main(String[] args) {
  7. Phone phone = new Phone();
  8. Socket socket = new Socket();
  9. ChargerAdapter chargerAdapter = new ChargerAdapter(socket);
  10. phone.charge(chargerAdapter);
  11. }
  12. }

接口适配器

简介

  • 又称缺省适配器模式
  • 当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现,那么该抽象类的子类可有选择的覆盖父类的某些方法来实现需求
  • 适用于一个接口不想使用其所有的方法的情况

例如现在有一个接口Interface1

  1. public interface Interface1 {
  2. void m1();
  3. void m2();
  4. void m3();
  5. void m4();
  6. }

现在有一个Client只想使用m1方法

  1. public class Client {
  2. public void solve(Interface1 i1){
  3. i1.m1();
  4. }
  5. }

于是就可以新建一个抽象适配器,让其实现Interface1:

  1. public abstract class ClientAdapter implements Interface1 {
  2. @Override
  3. public void m1() { }
  4. @Override
  5. public void m2() { }
  6. @Override
  7. public void m3() { }
  8. @Override
  9. public void m4() { }
  10. }

现在在使用Client的时候就可以使用ClientAdapter,只需重写方法m1即可

  1. public static void main(String[] args) {
  2. Client client = new Client();
  3. Interface1 interface1 = new ClientAdapter() {
  4. @Override
  5. public void m1() {
  6. System.out.println("ClientAdapter.m1");
  7. }
  8. };
  9. client.solve(interface1);
  10. }