• 适配器模式


    适配器模式

    说明

    1. @author JellyfishMIX - github / blog.jellyfishmix.com
    2. LICENSE GPL-2.0

    简介

    适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

    自己的理解,使用一个类 A 去实现接口 B,这样可以做到让类 A 兼容接口 B。

    适配器模式的代码

    类适配器模式

    /**
     * 目标接口
     */
    interface Target {
        public void request();
    }
    
    /**
     * 适配者接口
     */
    class Adaptee {
        public void specificRequest() {       
            System.out.println("适配者中的业务代码被调用!");
        }
    }
    
    /**
     * 适配器类
     */
    class ClassAdapter extends Adaptee implements Target {
        public void request() {
            specificRequest();
        }
    }
    
    /**
     * 测试用例
     */
    public class ClassAdapterTest {
        public static void main(String[] args) {
            System.out.println("类适配器模式测试:");
            Target target = new ClassAdapter();
            target.request();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    程序的运行结果如下:

    类适配器模式测试:
    适配者中的业务代码被调用!
    
    • 1
    • 2

    对象适配器模式

    class ObjectAdapter implements Target {
        private Adaptee adaptee;
        public ObjectAdapter(Adaptee adaptee) {
            this.adaptee = adaptee;
        }
        public void request() {
            adaptee.specificRequest();
        }
    }
    
    /**
     * 测试用例
     */
    public class ObjectAdapterTest {
        public static void main(String[] args) {
            System.out.println("对象适配器模式测试:");
            Adaptee adaptee = new Adaptee();
            Target target = new ObjectAdapter(adaptee);
            target.request();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    源码中的适配器模式

    用于 org.apache.logging.log4j (简称为 lo4j2) 与 slf4j 保持桥接,里面有适配器类。

            
            <dependency>
                <groupId>org.apache.logging.log4jgroupId>
                <artifactId>log4j-slf4j-implartifactId>
                <version>2.17.1version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20220722144705359

    Log4jMDCAdapter 是 log4j2 用来支持 slf4j 中 MDC 机制(MDC 机制是什么与本文主题无关,可以不用关注)的适配器,使用 log4j2 去实现 slf4j

    package org.apache.logging.slf4j;
    
    import java.util.Map;
    import org.apache.logging.log4j.ThreadContext;
    import org.slf4j.spi.MDCAdapter;
    
    /**
     * log4j2 用来支持 sl4j 中 MDC 机制的适配器
     */
    public class Log4jMDCAdapter implements MDCAdapter {
        public Log4jMDCAdapter() {
        }
    
        public void put(final String key, final String val) {
            ThreadContext.put(key, val);
        }
    
        public String get(final String key) {
            return ThreadContext.get(key);
        }
    
        public void remove(final String key) {
            ThreadContext.remove(key);
        }
    
        public void clear() {
            ThreadContext.clearMap();
        }
    
        public Map<String, String> getCopyOfContextMap() {
            return ThreadContext.getContext();
        }
    
        public void setContextMap(final Map map) {
            ThreadContext.clearMap();
            ThreadContext.putAll(map);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    可以看到主要有两个 import

    import org.apache.logging.log4j.ThreadContext;
    import org.slf4j.spi.MDCAdapter;

    其中 MDCAdapter 是要实现的目标接口,ThreadContext 是 log4j2 里的一个类也就是适配者(由于 ThreadContext 里是静态方法,适配器并没有去继承它,而是选择直接使用静态方法)。

  • 相关阅读:
    ubuntu22.04编译PBRT-v4
    【数据结构】带头双向循环链表
    关于代码性能优化的总结
    离线数仓 (十二) --------- DIM 层搭建
    高压差分探头导致的驱动电压离谱的原因
    Day719. 矢量运算 -Java8后最重要新特性
    【牛客刷题】前端--JS篇(二)
    高薪程序员&面试题精讲系列143之如何进行项目测试--下篇?你熟悉单元测试吗?压力测试怎么回事?
    QTimer类的使用方法
    QT之QChart的简介
  • 原文地址:https://blog.csdn.net/weixin_43735348/article/details/127580677