深度学习设计模式之适配器模式

文章目录


前言

本文主要学习适配器模式,见名知意,适配器让两个本来接口不兼容不能一起工作的类,合作无间。


一、介绍

适配器模式主要是把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。

常见的几类适配器如下:

  • 类的适配器模式:将一个类转换成满足另一个新接口的类时,可以使用类的适配器器模式,创建一个新类,继承原有的类,实现新的接口即可。
  • 对象的适配器模式:将一个对象转换成满足另一个新接口的对象时,可以创建一个适配器类,持有原类的一个实例,在适配器类的方法中,调用实例的方法就行。
  • 接口的适配器模式:实现一个接口中所有的方法时,可以创建一个Adapter,实现所有方法,在写别的类的时候,继承Adapter类即可。

二、详细分析

1.核心组成

  • 目标角色(Target):期待得到的接口;
  • 源角色(Adaptee):需要适配的接口;
  • 适配器角色(Adapter):把源接口转换为目标接口。

接口适配器模式

一个类不需要实现接口类所有的接口时使用。

类适配器模式

A类与B类互不关联,要做到互相调用时使用。

2.实现步骤

接口适配器模式

一个类不需要实现所有接口类的接口时使用。

  1. 新建接口类;
  2. 新建适配器类,实现接口类(空实现);
  3. 新建源类,继承适配器类,想实现几个接口就实现几个接口。

类适配器模式

A类与B类互不关联,要做到互相调用时使用。

  1. 新建源类,包含源类方法;
  2. 新建目标类(接口),目标类中有一个方法与源类方法一致;
  3. 新建适配器类,继承源类,实现目标类;

3.代码示例

接口适配器模式

场景:动物类通用接口,包含了多个方法如:叫,跑,飞,游泳等等。如果新建小狗类来实现动物类接口,其中的有些方法是小狗所不需要的,如飞,游泳。所以新建适配器类只实现小狗类所关注的接口。

目标类

复制代码
/**
 * 动物类接口
 */
public interface Animal {
    /**
     * 叫
     */
    void call();
    /**
     * 跑
     */
    void run();
    /**
     * 飞
     */
    void fly();
    /**
     * 游泳
     */
    void swim();
    /**
     * 跳
     */
    void jump();
}

适配器类

复制代码
/**
 * 适配器类
 */
public class DogAdapter implements Animal{
    @Override
    public void call() {

    }

    @Override
    public void run() {

    }

    @Override
    public void fly() {

    }

    @Override
    public void swim() {

    }

    @Override
    public void jump() {

    }
}

源类

复制代码
public class Dog extends DogAdapter{

    @Override
    public void call() {
        System.out.println("叫");
    }

    @Override
    public void run() {
        System.out.println("跑");
    }
}

测试类

复制代码
public static void main(String[] args) {
        // 直接new 对象 调用方法
        Dog dog = new Dog();
        dog.call();
        dog.run();
    }

结果

类适配器模式

场景:一台电脑要播放U盘中的视频,需要使用转接头关联U盘。

目标类

复制代码
/**
 * 目标类
 */
public interface ComputerTarget {

    /**
     * 与电脑类的方法一致
     */
    void player();

    /**
     * 视频
     */
    void video();

}

源类

复制代码
public class Computer {
    public void player(){
        System.out.println("打开播放器播放");
    }
}

适配器

复制代码
/**
 * 适配器
 */
public class USBDriveAdapter extends Computer implements ComputerTarget {
    /**
     * 视频
     */
    @Override
    public void video(){
        System.out.println("视频");
    }
}

测试类

复制代码
public static void main(String[] args) {
        USBDriveAdapter usbDriveAdapter = new USBDriveAdapter();
        usbDriveAdapter.player();
        usbDriveAdapter.video();
    }

结果

4.优缺点

优点

  • 可以让任何两个没有关联的类一起运行,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;
  • 增加灵活度, 提高复用性,适配器类可以在多个系统使用,符合开闭原则。

缺点

  • 过多的使用适配器,会让系统非常零乱,不易整体进行把握。

5.使用场景

  • 系统需要复用现有类,而该类的接口不符合系统的需求,可以使用适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;
  • 多个组件功能类似,但接口不统一且可能会经常切换时,可使用适配器模式,使得客户端可以以统一的接口使用它们。

总结

以上简单介绍了适配器模式的优缺点和使用场景,还提供了代码示例。

相关推荐
海特伟业11 小时前
隧道调频广播覆盖-隧道调频广播无线覆盖系统建设要点、难点分析与解决应对
运维·设计模式
sg_knight12 小时前
设计模式实战:享元模式(Flyweight)
python·设计模式·享元模式·flyweight
Swift社区14 小时前
AI 时代,ArkUI 的设计模式会改变吗?
人工智能·设计模式
数据中穿行14 小时前
访问者设计模式全方位深度解析
设计模式
宁雨桥15 小时前
前端设计模式面试题大全
前端·设计模式
数据中穿行16 小时前
迭代器设计模式全方位深度解析
设计模式
数据中穿行16 小时前
观察者设计模式全方位深度解析
设计模式
程序员Terry17 小时前
别老写重复代码了!模版方法模式一次讲透
java·设计模式
数据中穿行17 小时前
建造者模式全方位深度解析
设计模式