设计模式之适配器模式

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】 

适配器模式

定义

在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

适配器模式主要应用于,当接口里定义的方法无法满足客户的需求,或者说接口里定义的方法的名称或者方法界面与客户需求有冲突的情况。

(引用百度百科)

适配器模式 (英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。

适配器模式有两种实现方式: 类适配器对象适配器

  • 类适配器使用继承关系来实现
  • 对象适配器使用组合关系来实现。

(引用维基百科)

比如像USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。

类图

  1. 类适配器

    设计模式之适配器模式_第1张图片
  2. 对象适配器

    设计模式之适配器模式_第2张图片

实现

类适配器

1. 被适配者
    public class Adaptee {
        /**
         * Info 级别
         * @param msg
         */
        public void slf4jInfo(String msg) {
            System.out.println("[Adaptee INFO]: " + msg);
        }
    
        /**
         * debug级别
         * @param msg
         */
        public void slf4jDebug(String msg) {
            System.out.println("[Adaptee DEBUG]: " + msg);
        }
    }
2. 适配器
    public interface Logger {
        /**
         * Info 级别
         * @param msg
         */
        void info(String msg);
    
        /**
         * debug级别
         * @param msg
         */
        void debug(String msg);
    }
     
    /**
     * 类适配器
     */
    public class Adaptor extends Adaptee implements Logger{
        @Override
        public void info(String msg) {
            slf4jInfo(msg);
        }
    
        @Override
        public void debug(String msg) {
            slf4jDebug(msg);
        }
    }

3. Main

    public class T {
        public static void main(String[] args) {
            Logger logger = new Adaptor();
            logger.info("hello");
        }
    }

对象适配器

1. 被适配者
    public class Adaptee {
        public void info(String msg) {
            System.out.println("[INFO]底层日志实现: Log4J2. " + msg);
        }
    
        public void debug(String msg) {
            System.out.println("[DEBUG]底层日志实现: Log4J2. " + msg);
        }
    }
2. 适配器
    /**
     * 定义日志接口
     */
    public interface Logger {
        /**
         * Info 级别
         * @param msg
         */
        void info(String msg);
    
        /**
         * debug级别
         * @param msg
         */
        void debug(String msg);
    }
    
    /**
     * 适配器持有被适配者的引用
     */
    public class LogAdaptor implements Logger{
        Adaptee log4J = new Adaptee();
        @Override
        public void info(String msg) {
            log4J.info(msg);
        }
    
        @Override
        public void debug(String msg) {
            log4J.debug(msg);
        }
    }

3. Main

    public class T {
        public static void main(String[] args) {
            Logger logger = new LogAdaptor();
            logger.info("hello");
        }
    }

总结

  1. 适配模式有两种,到底如何选择?

    判断的标准主要有两个,一个是Adaptee接口的个数,另一个是 AdapteeTarget 的契合程度。

    • 如果 Adaptee 接口并不多,那两种实现方式都可以。
    • 如果 Adaptee 接口很多,而且 Adaptee 和 Target 接口定义大部分都相同,那我们推荐使用类适配器,因为 Adaptor 复用父类 Adaptee 的接口,比起对象适配器的实现方式,Adaptor 的代码量要少一些。
    • 如果 Adaptee 接口很多,而且 Adaptee 和 Target 接口定义大部分都不相同,那我们推荐使用对象适配器,因为组合结构相对于继承更加灵活。
  2. 应用场景

    一般来说,适配器可看作为一种补偿模式,用来弥补设计上的缺陷。或者由于历史原因导致接口不统一,需要适配器适配两者不同接口。

    • 封装有缺陷的接口设计
    • 统一多个类的接口设计
    • 替换依赖的外部系统
    • 兼容老版本接口
    • 适配不同格式的数据
  3. 代理、桥接、装饰器、适配器 4 种设计模式的区别

    代理、桥接、装饰器、适配器,这 4 种模式是比较常用的结构型设计模式。它们的代码结构非常相似。笼统来说,它们都可以称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类。

    • 代理模式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大的不同。
    • 桥接模式:桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变。
    • 装饰器模式:装饰者模式在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的嵌套使用。
    • 适配器模式:适配器模式是一种事后的补救策略。适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口。

你可能感兴趣的:(设计模式,设计模式,适配器模式)