适配器模式——java设计模式(八)

简介

适配器模式(Adapter Pattern):将一个类的接口转换成希望的另一个接口,让那些接口不兼容的类可以一起工作。

  • 如果需要复用已有的类,但是接口不兼容,不能或者不愿修改原有的类或者需要的类。可以使用适配器,用户在调用适配器的方法时在适配器的内部会调用适配者的方法。
  • 又称包装器模式

结构和实现

  • 角色包括:
    • 目标抽象类:定义用户需要的接口。
    • 适配器类:作为转换器调用另一个接口,使得目标类和适配者类联系。类适配器中,继承适配者实现目标类接口,对象适配器中,关联适配者,继承目标类。
    • 适配者类:定义了一个已存在的接口,包含需要的业务方法,但是和需要的接口不兼容。

类适配器

  • 适配器类和适配者类是继承关系,适配器实现目标类接口。
    180506.classadapter.png

对象适配器

  • 适配器类和适配者类是关联关系,适配器继承目标类。可以同时适配多个适配者
    180506.objectadapter.png

实例

  • 开发玩具车控制软件,该车在移动的过程中闪光和提示声音。以往已经开发了灯闪烁和提示声音的程序,需要重用这些程序,并且使软件具有更好的灵活性和扩展性。
    180506.car.png
  • 客户端调用CarController这一抽象类,实现类适配器PoliceCarAdapter在配置文件中给出。

缺省适配器

  • 不需要实现一个接口的所有方法时,可先用一个抽象类实现该接口,并为每种方法提供默认实现(空方法)。具体业务类可以选择性的覆盖抽象类中的方法。
  • 用于不想使用一个接口的所有方法,又称单接口适配器模式
    180506.default.png

双向适配器

  • 适配器中同时包含目标类和适配者类的引用,使得目标类和适配者通过适配器互相调用
    180506.double.png

优缺点和适用环境

优点

  • 通用:
    • 解耦目标类和适配者类。引入适配器类重用现有的适配者类,无需修改原有代码。
    • 增加透明性和复用性。具体业务方法封装在适配者内,可以在多个系统中重用,用户通过适配器可以透明的使用业务方法。
    • 灵活性和扩展性好。通过配置文件更换适配器,并且可以不修改源码新增适配器,符合开闭原则。
  • 类适配器:
    • 置换适配者方法。适配器继承适配者,重写方法增强灵活性。
  • 对象适配器:
    • 多个适配者适配到同一个目标。
    • 可以适配一个适配者的子类,增强扩展性。

缺点

  • 类适配器:
    • 某些语言不支持多继承,只能适配一个适配者类,并且目标类只能为接口,有局限性。
    • 适配者类不能为最终类,如java中的final,无法继承。
  • 对象适配器:
    • 置换适配者的方法复杂。需要使用适配者的子类,在子类中重写方法,适配器调用这一子类。

适用环境

  • 系统需要一些现有的类,但是他们的接口不符合需要,甚至没有源代码。
  • 一个类可以重复使用,会和没有多少关联的类一起工作。

jdk中的应用

  • InputStreamReader作为适配器,Reader作为目标类,InputStream作为适配者。
    180509.InputStreamReader.png
  • InputStreamReader中调用的StreanDecoder负责解码。字节流和字符流的转换
    public int read() throws IOException {
        return sd.read();
    }

猜你喜欢

转载自blog.csdn.net/qq_40369829/article/details/80265872
今日推荐