Java设计模式中的适配器模式

 更新时间:2022年07月19日 09:26:14   作者:爱学习的大鱼​​​​​​​  
这篇文章主要介绍了Java设计模式中的适配器模式,适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器

基本介绍

  • 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)
  • 适配器模式属于结构型模式
  • 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式

工作原理

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

类适配器模式

背景介绍:在中国电源大都是220伏的,而日常生活中手机的充电确是5伏1安(苹果),通过类适配器模拟电源适配器实现手机充电功能

Voltage220V(被适配电源)

public class Voltage220V {

    public int output220V() {
        int src = 220;
        System.out.println("电压 = " + src + "伏");
        return src;
    }
}

Voltage5V(目标输出)

public interface Voltage5V {
    int output5V();
}

VoltageAdapter(电源适配器)

public class VoltageAdapter extends Voltage220V implements Voltage5V {
    @Override
    public int output5V() {
        int src = output220V();
        int dst = src / 44;
        System.out.printf("适配器将%d伏====>%d伏\n", src, dst);
        return dst;
    }
}

Phone(手机充电)

public class Phone {
    public void charging(Voltage5V v) {
        int src = v.output5V();
        if (src <= 5 && src > 0) {
            System.out.println("电压 = " + src + "伏,可以充电...");
        } else if (src > 5) {
            System.out.println("电压过高");
        } else {
            System.out.println("没有充电...");
        }
    }
}

Client

public class Client {
    public static void main(String[] args) {
        System.out.println("====类适配器模式====");
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter());
    }
}

实现结果:

类适配器模式注意事项和细节

  • Java是单继承机制,所以类适配器需要继承src类这一点算是- -一个缺点,因为这要求dst必须是接口,有一定局限性;
  • src类的方法在Adapter中都会暴露出来,也增加了使用的成本。

对象适配器模式

优点:

  • 基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承src类,而是持有src类的实例,以解决兼容性的问题。即: 持有sre类,实现dst类接口,完成src->dst的适配
  • 根据“合成复用原则”,在系统中尽量使用关联关系(聚合)来替代继承关系。
  • 对象适配器模式是适配器模式常用的一种

UML类图:

其他代码与上一致,修改电源适配器即可:

public class VoltageAdapter implements Voltage5V {
    private Voltage220V voltage220V = null;
    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }
    @Override
    public int output5V() {
        int src = 0;
        if (voltage220V != null) {
            src = voltage220V.output220V();
        }
        int dst = src / 44;
        System.out.printf("适配器将%d伏====>%d伏\n",src,dst);
        return dst;
    }
}

Client(测试)

public class Client {
    public static void main(String[] args) {
        System.out.println("====对象适配器模式====");
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter(new Voltage220V()));
        System.out.println("--------------------");
        phone.charging(new VoltageAdapter(null));
    }
}

实现结果:

接口适配器模式

简介:

  • 一些书籍称为:适配器模式(Default Adapter Pattermn)或缺省适配器模式。
  • 核心思路:当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求。
  • 适用于一个接口不想使用其所有的方法的情况。

UML类图

背景介绍:模拟springMVC源码展示接口设计模式

接口适配器和实现类

///定义一个Adapter接口 
public interface HandlerAdapter {
   public boolean support(Controller handler);
   public void handle(Controller handler);
}
// 多种适配器类
class SimpleHandlerAdapter implements HandlerAdapter {
   public void handle(Controller handler) {
       handler.doHandler();
   }
   public boolean support(Controller handler) {
      return (handler instanceof SimpleController);
   }
}
class HttpHandlerAdapter implements HandlerAdapter {
   public void handle(Controller handler) {
      handler.doHandler();
   }
   public boolean support(Controller handler) {
      return (handler instanceof HttpController);
   }

}
class AnnotationHandlerAdapter implements HandlerAdapter {
   public void handle(Controller handler) {
      handler.doHandler();
   }

   public boolean support(Controller handler) {

      return (handler instanceof AnnotationController);
   }
}

模拟Controller

//多种Controller实现  
public interface Controller {
   void doHandler();
}
class HttpController implements Controller {
   @Override
   public void doHandler() {
      System.out.println("http...");
   }
}
class SimpleController implements Controller {
   @Override
   public void doHandler() {
      System.out.println("simple...");
   }
}
class AnnotationController implements Controller {
   @Override
   public void doHandler() {
      System.out.println("annotation...");
   }
}

模拟DispatchServlet

public class DispatchServlet {
   public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();
   public DispatchServlet() {
      handlerAdapters.add(new AnnotationHandlerAdapter());
      handlerAdapters.add(new HttpHandlerAdapter());
      handlerAdapters.add(new SimpleHandlerAdapter());
   }
   public void doDispatch(Controller controller) {
      // 得到对应适配器
      HandlerAdapter adapter = getHandler(controller);
      // 通过适配器执行对应的controller对应方法
      if (adapter != null) {
         adapter.handle(controller);
      } else {
         System.out.println("没有该适配器...");
      }

   }
   public HandlerAdapter getHandler(Controller controller) {
      //遍历:根据得到的controller(handler), 返回对应适配器
      for (HandlerAdapter adapter : this.handlerAdapters) {
         if (adapter.support(controller)) {
            return adapter;
         }
      }
      return null;
   }

   public static void main(String[] args) {
      new DispatchServlet().doDispatch(new SimpleController() ); 
		new DispatchServlet().doDispatch(new HttpController() ); 
		new DispatchServlet().doDispatch(new AnnotationController()); 
   }

}

实现结果:

适配器模式的注意事项和细节

  • 三种命名方式,是根据sre 是以怎样的形式给到Adapter (在Adapter里的形式)来命名的。
  • 类适配器:以类给到,在Adapter里,就是将src当做类,继承
  • 对象适配器:以对象给到,在Adapter里,将sre作为一个对象,持有
  • 接口适配器:以接口给到,在Adapter里,将src作为一个接口,实现Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作。

到此这篇关于Java设计模式中的适配器模式的文章就介绍到这了,更多相关Java适配器模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring用代码来读取properties文件实例解析

    Spring用代码来读取properties文件实例解析

    这篇文章主要介绍了Spring用代码来读取properties文件实例解析,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java并发编程之对象的共享

    Java并发编程之对象的共享

    这篇文章主要介绍了Java并发编程之对象的共享,介绍如何共享和发布对象,使它们被安全地由多个进程访问。需要的小伙伴可以参考一下
    2022-04-04
  • Java选择结构与循环结构的使用详解

    Java选择结构与循环结构的使用详解

    循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环,选择结构用于判断给定的条件,根据判断的结果判断某些条件,根据判断的结果来控制程序的流程
    2022-03-03
  • Java中BigDecimal使用注意避坑指南

    Java中BigDecimal使用注意避坑指南

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算,下面这篇文章主要给大家介绍了关于Java中BigDecimal使用注意避坑的相关资料,需要的朋友可以参考下
    2023-02-02
  • IDEA调试技巧条件断点实现步骤详解

    IDEA调试技巧条件断点实现步骤详解

    这篇文章主要介绍了IDEA调试技巧条件断点实现步骤详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java基础之TreeMap详解

    Java基础之TreeMap详解

    这篇文章主要介绍了Java基础之TreeMap详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 详解Java中的sleep()和wait()的区别

    详解Java中的sleep()和wait()的区别

    这篇文章主要介绍了详解Java中的sleep()和wait()的区别的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • java封装及四种权限修饰符详解

    java封装及四种权限修饰符详解

    这篇文章主要介绍了java封装及四种权限修饰符详解,对属性进行封装,使用户不能直接输入数据,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值
    2022-08-08
  • 深入理解java泛型详解

    深入理解java泛型详解

    这篇文章主要介绍了Java中的泛型详解,什么是泛型,作用以及基础实例等,喜欢的朋友可以参考
    2017-04-04
  • 初探Spring Cloud Gateway实战

    初探Spring Cloud Gateway实战

    这篇文章主要介绍了创建网关项目(Spring Cloud Gateway)过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08

最新评论