适配器模式:快速兼容旧接口

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战设计模式

整体来讲设计模式分为三大类:建立型模式、结构型模式、行为型模式。前面的系列文章都是为建立型模式:markdown

《单例模式——8种实现方式》ide

《工厂模式:工厂方法模式和抽象工厂模式》post

《原型模式:快速复制已有实例建立新的实例》学习

<建造者模式>编码

从今天起,咱们开始学习结构型模式。spa

结构型模式:主要用于描述如何组合类和对象以得到更大的结构。设计

适配器模式

适配器模式(Adapter Pattern)定义:将一个类的接口转换成客户但愿的另一个接口,使得本来因为接口不兼容而不能一块儿工做的那些类能一块儿工做code

适配器模式核心意义:兼容旧接口orm

适配器在咱们生活中随处可见,好比电源适配器,不少电器并非直接使用220V电源,而须要一个电源适配器才能正常使用;还有咱们笔记本电脑的外接接口,若是只有一个HDMI接口,想用在只能使用VGA接口上的设备上,咱们就须要一个额外转接头,这个转接头咱们就称做适配器。

适配器模式原理咱们就能够理解成适配器在生活中的做用。

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

  • 目标(Target)接口:当前系统业务所期待的接口,它能够是抽象类或接口。
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,经过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

这三种角色用笔记本电脑外接接口例子来讲,HDMI接口是咱们的目标接口,由于咱们电脑提供功能是HDMI接口视频输出;VGA设备就是适配者,咱们最终须要把视频输出在VGA设备上;转接头就是咱们的适配器

适配器模式编码实现

如今咱们有一个1.0版本商城场景,系统刚运行起来,咱们没有自营商品,当前的商品都是第三方提供的,因此咱们商品下单时,要对接第三方下单服务:

// 第三方订单服务
public class ThirdOrderService {
    // 调用该方法,实现第三方接口下单
    void thirdCreateOrder() {
        System.out.println("第三方服务接口下单");
    }
}
复制代码

后面咱们商城系统发展起来了,对于商城的绝大部分商品,都变为自营的了,后续商品的下单只须要咱们调用本身的下单接口。

// 订单服务接口
public interface OrderService {
    /**
     * 建立订单接口
     */
    void createOrder();
}
复制代码

可是,商城还有少部分是第三方提供的的商品,而咱们新的建立订单接口并不兼容旧第三方接口。这时候,咱们就可使用适配器模式,使新的订单接口兼容旧的第三方接口

// 第三方订单接口适配器
public class ThirdOrderServiceAdapter implements OrderService {

    private ThirdOrderService thirdOrderService;

    public ThirdOrderServiceAdapter() {
        thirdOrderService = new ThirdOrderService();
    }

    @Override
    public void createOrder() {
        thirdOrderService.thirdCreateOrder();
    }
}
复制代码

客户端使用状况

public class Client {
    public static void main(String[] args) {
        OrderService orderService = new ThirdOrderServiceAdapter();
        orderService.createOrder();
    }
}
// 输出结果:
第三方服务接口下单
复制代码

从客户端调用来看,咱们经过第三方订单接口适配器,使新的建立订单接口兼容了旧的第三方接口调用。

对象适配器和类适配器

适配器模式通常有两种不一样的适配方法:对象适配和类适配。上面所演示的就是对象适配(经过组合方式)。接下来咱们看看类适配器,经过继承方式实现。

public class ThirdOrderServiceAdapter2 extends ThirdOrderService implements OrderService {
    @Override
    public void createOrder() {
        // 调用父类的第三方订单建立接口
        super.thirdCreateOrder();
    }
}
复制代码

一般,咱们喜欢使用组合多于继承,因此更经常使用的是对象适配方式。类适配方式违背了咱们的组合/聚合复用原则

相关文章
相关标签/搜索