基本介绍

  • 适配器模式将某个类的接口转换成客户端希望的另一种接口表示.主要目的是兼容性, 可以让原本因为接口不匹配不能一起工作的两个类可以协同工作.

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

类适配器模式

通过继承目标类,实现另一个类的接口,从而实现适配。

  1. // 输出5V电压的接口
  2. public interface Voltage5V {
  3. public int output5V();
  4. }
  5. //被适配的类
  6. public class Voltage220V {
  7. //输出220V的电压
  8. public int output220V(){
  9. int src = 220;
  10. System.out.println("电压 = "+src+"伏");
  11. return src;
  12. }
  13. }
  14. //用这个适配器来实现转换
  15. public class VoltageAdapter extends Voltage220V implements Voltage5V {
  16. @Override
  17. public int output5V() {
  18. //获取到220V
  19. int srcV = output220V();
  20. // 转化成5V的电压
  21. int dstV = srcV / 44;
  22. return dstV;
  23. }
  24. }
  25. //定义一个使用者
  26. public class Phone {
  27. //充电
  28. public void charging(Voltage5V voltage5V){
  29. if(voltage5V.output5V() == 5){
  30. System.out.println("电压为5V,可以充电");
  31. }else{
  32. System.out.println("电压大于5V,不能充电");
  33. }
  34. }
  35. }
  36. //进行测试
  37. public class Client {
  38. public static void main(String[] args) {
  39. System.out.println("适配器模式");
  40. Phone phone = new Phone();
  41. phone.charging(new VoltageAdapter());
  42. }
  43. }

对象适配器模式

基本思路和类适配器模式一样,不过不是继承那个类了,而是持有一个类,以解决兼容性问题。
只需要修改一下适配器类就行。

  1. // 修改一下类适配器
  2. public class VoltageAdapter implements Voltage5V {
  3. private Voltage220V voltage220V;
  4. public VoltageAdapter(Voltage220V voltage220V) {
  5. this.voltage220V = voltage220V;
  6. }
  7. @Override
  8. public int output5V() {
  9. int dst = 0;
  10. if(voltage220V!=null){
  11. //获取220V的电压
  12. int src = voltage220V.output220V();
  13. System.out.println("使用对象适配器,进行适配~");
  14. dst = src/44;
  15. System.out.println("适配完成,输出的电压为 = "+dst);
  16. }
  17. return dst;
  18. }
  19. }
  20. // 进行测试的时候传入一个Voltage220V就好
  21. public class Client {
  22. public static void main(String[] args) {
  23. System.out.println("适配器模式");
  24. Phone phone = new Phone();
  25. phone.charging(new VoltageAdapter(new Voltage220V()));
  26. }
  27. }

接口适配器模式

接口适配器模式核心思路:当不需要全部实现接口提供的方法的时候,可以先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认(空方法)实现,那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求。

  1. //提供一个接口
  2. public interface Interface4 {
  3. public void m1();
  4. public void m2();
  5. public void m3();
  6. public void m4();
  7. }
  8. public abstract class AbsAdapter implements Interface4{
  9. //默认实现
  10. @Override
  11. public void m1(){ }
  12. @Override
  13. public void m2(){ }
  14. @Override
  15. public void m3(){ }
  16. @Override
  17. public void m4(){ }
  18. }
  19. public class Client {
  20. public static void main(String[] args) {
  21. AbsAdapter absAdapter = new AbsAdapter(){
  22. @Override
  23. public void m1(){
  24. // 有选择的覆盖了m1方法
  25. System.out.println("使用了m1 的方法");
  26. }
  27. };
  28. absAdapter.m1();
  29. }
  30. }