首页 > 其他 > 详细

003-结构型-01-适配器模式(Adapter)

时间:2019-07-16 11:41:20      阅读:103      评论:0      收藏:0      [点我收藏+]

一、概述

  将一个类的接口转换成客户期望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。

1.1、适用场景

  • 已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
  • 不是软件设计阶段考虑的设计模式,是随着软件维护。由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案

1.2、优缺点

优点:

  • 能提高类的透明性和复用,现有的类复用但不需要改变
  • 目标类和适配器类解耦,提高程序扩展性
  • 符合开闭原则

缺点:

  • 适配器编写过程需要全面考虑,可能会增加系统的复杂性
  • 增加系统代码可读的难度

1.3、类图角色及其职责

适配器类型有两种类型实现,一种是类适配器,一种是对象适配器。

1.3.1、类适配:创建新类,继承源类,并实现新接口,例如 

    技术分享图片

    让Adapter继承Adaptee类,Client在使用Target的request()接口(实际上是调用Adapter的request()方法)时,间接调用adapteeRequest()方法。

class Adaptee{
    void adapteeRequest(){
        System.out.println("com.github.bjlhx15.patterns.base.structure.adapter.Adaptee.adapteeRequest");
    }
}
interface Target{
    void request();
}

public class Adapter extends Adaptee implements Target{

    @Override
    public void request() {
        System.out.println("com.github.bjlhx15.patterns.base.structure.adapter.Adapter.request");
        this.adapteeRequest();
    }
}

  测试

    @Test
    public void request() {
        Target target = new Adapter();
        target.request();
    } 

  上述类图

    技术分享图片

1.3.2、对象适配:创建新类持源类的实例,并实现新接口,例如 

  技术分享图片

  对比着类适配器理解。在Adapter内部创建Adaptee对象,Client在使用Target的request()接口(实际上是调用Adapter的request()方法)时,间接调用adapteeRequest()方法。

class Adaptee2{
    void adapteeRequest2(){
        System.out.println("com.github.bjlhx15.patterns.base.structure.adapter.Adaptere2.adapteeRequest2");
    }
}

interface Target2{
    void request();
}

public class Adapter2 implements Target2 {
    private Adaptee2 adaptee2;

    public Adapter2(Adaptee2 adaptee2) {
        this.adaptee2 = adaptee2;
    }
    @Override
    public void request() {
        System.out.println("com.github.bjlhx15.patterns.base.structure.adapter.Adapter2.request");
        adaptee2.adapteeRequest2();
    }
}

测试

    @Test
    public void request() {
        Target2 target2 = new Adapter2(new Adaptee2());
        target2.request();
    }

上述类图

  技术分享图片

适配器模式包含一下三个角色:

  • Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于Java语言不支持多重继承,所以它很可能是接口。

  • Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。它是适配器模式的核心。

  • Adaptee(被适配类):被适配类即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。

1.4、演进过程

二、扩展

扩展-JDK1.7以及框架源码中的适配器模式

javax.xml.bind.annotation.adapters.XmlAdapter

org.springframework.aop.framework.adapter.AdvisorAdapter、MethodBeforeAdviceAdapter

org.springframework.orm.jpa.JpaVendorAdapter

org.springframework.web.servlet.HandlerAdapter、org.springframework.web.servlet.DispatcherServlet、org.springframework.web.servlet.mvc.Controller

2.1、分析org.springframework.web.servlet.HandlerAdapter

类图

  技术分享图片

2.1、分析org.springframework.web.servlet.mvc.Controller

类图

  技术分享图片

 

003-结构型-01-适配器模式(Adapter)

原文:https://www.cnblogs.com/bjlhx/p/11193799.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!