当前位置: 首页 > article >正文

六、结构型(适配器模式)

适配器模式

概念
适配器模式是一种结构型设计模式,允许将一个接口转换成客户端所期望的另一种接口。适配器模式使得原本由于接口不兼容而无法一起工作的类可以一起工作。


应用场景

  1. 遗留系统:当新系统需要使用旧系统中的功能时,适配器模式可以使新旧系统接口兼容。
  2. 接口不兼容:当多个类具有相似的功能,但其接口不兼容时,可以使用适配器来适应不同的接口。
  3. 组件复用:在使用第三方组件时,适配器可以将其接口适配为应用程序所需的接口,从而实现组件复用。
  4. 外部接口整合:在多个外部接口需要整合为一个统一接口时,适配器模式非常有效。

注意点

  • 适配器的复杂性:适配器模式可能会增加系统的复杂性,过多的适配器可能导致系统难以理解。
  • 性能开销:由于适配器引入了额外的层次,可能会有一定的性能开销。
  • 设计意图:确保适配器的设计意图清晰,以便于理解适配器的作用。

核心要素

  1. 目标接口:客户端所期望的接口。
  2. 适配者类:需要被适配的类。
  3. 适配器类:实现目标接口,并持有适配者对象的引用,负责将请求转发给适配者。

Java代码完整示例

// 目标接口
interface Target {
    void request();
}

// 适配者类
class Adaptee {
    public void specificRequest() {
        System.out.println("适配者的方法");
    }
}

// 适配器类
class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        System.out.println("适配器转发请求");
        adaptee.specificRequest(); // 调用适配者的方法
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new Adapter(adaptee);
        target.request(); // 通过适配器调用适配者的方法
    }
}

各种变形用法完整示例

  1. 类适配器模式
    通过继承实现适配器。

    代码示例

    // 目标接口
    interface Target {
        void request();
    }
    
    // 适配者类
    class Adaptee {
        public void specificRequest() {
            System.out.println("适配者的方法");
        }
    }
    
    // 类适配器
    class ClassAdapter extends Adaptee implements Target {
        @Override
        public void request() {
            System.out.println("类适配器转发请求");
            specificRequest(); // 调用适配者的方法
        }
    }
    
    // 客户端
    public class ClientClassAdapter {
        public static void main(String[] args) {
            Target target = new ClassAdapter();
            target.request(); // 通过类适配器调用适配者的方法
        }
    }
    
  2. 对象适配器模式
    通过组合实现适配器。

    代码示例

    // 目标接口
    interface Target {
        void request();
    }
    
    // 适配者类
    class Adaptee {
        public void specificRequest() {
            System.out.println("适配者的方法");
        }
    }
    
    // 对象适配器
    class ObjectAdapter implements Target {
        private Adaptee adaptee;
    
        public ObjectAdapter(Adaptee adaptee) {
            this.adaptee = adaptee;
        }
    
        @Override
        public void request() {
            System.out.println("对象适配器转发请求");
            adaptee.specificRequest(); // 调用适配者的方法
        }
    }
    
    // 客户端
    public class ClientObjectAdapter {
        public static void main(String[] args) {
            Adaptee adaptee = new Adaptee();
            Target target = new ObjectAdapter(adaptee);
            target.request(); // 通过对象适配器调用适配者的方法
        }
    }
    
  3. 多个适配者的适配
    适配多个适配者以实现目标接口。

    代码示例

    // 目标接口
    interface Target {
        void request();
    }
    
    // 适配者类1
    class Adaptee1 {
        public void specificRequest1() {
            System.out.println("适配者1的方法");
        }
    }
    
    // 适配者类2
    class Adaptee2 {
        public void specificRequest2() {
            System.out.println("适配者2的方法");
        }
    }
    
    // 适配器类
    class MultiAdapter implements Target {
        private Adaptee1 adaptee1;
        private Adaptee2 adaptee2;
    
        public MultiAdapter(Adaptee1 adaptee1, Adaptee2 adaptee2) {
            this.adaptee1 = adaptee1;
            this.adaptee2 = adaptee2;
        }
    
        @Override
        public void request() {
            System.out.println("多适配器转发请求");
            adaptee1.specificRequest1(); // 调用适配者1的方法
            adaptee2.specificRequest2(); // 调用适配者2的方法
        }
    }
    
    // 客户端
    public class ClientMultiAdapter {
        public static void main(String[] args) {
            Adaptee1 adaptee1 = new Adaptee1();
            Adaptee2 adaptee2 = new Adaptee2();
            Target target = new MultiAdapter(adaptee1, adaptee2);
            target.request(); // 通过多适配器调用多个适配者的方法
        }
    }
    

这些示例展示了适配器模式的基本用法及其变形。


http://www.kler.cn/a/348898.html

相关文章:

  • windows系统备份mysql数据库bat脚本
  • 内核initcall解读
  • 随机掉落的项目足迹:解决TypeError: Cannot read properties of undefined (reading ‘push‘)报错
  • python从0快速上手(十)文件和异常处理2
  • MySQL函数特性详解
  • 案例-登录认证(上)
  • phpstrom 部署ftp 连接失败 宝塔ftp失败
  • 1879 C. Make it Alternating
  • 瑞_RabbitMQ_Java客户端SpringAMQP
  • Redis 常用指令技术解读
  • MySQL表的基本查询上
  • 中国各大一线及二线省会城市程序员收入大比拼,看看你所在的城市的统计是否准确
  • Flask Web应用开发流程
  • 自定义注解和组件扫描在Spring Boot中动态注册Bean(二)
  • opencv学习:人脸识别FisherFaceRecognizer_create算法的使用
  • MATLAB(Octave)混电动力能耗评估
  • 电话聊天狂人
  • 关于Transformer的相关问题
  • 【含文档】基于Hadoop平台的大学多媒体教学管理系统(含源码+数据库+lw)
  • MySQL C/C++ 的 API