• 详解设计模式:适配器模式


    适配器模式(Adapter Pattern)又称为变压器模式,是 GoF 的 23 种设计模式中的一种结构型设计模式。适配器模式 的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作

    ~

    本篇内容包括:关于适配器模式、适配器的实现 Demo



    一、关于适配器模式

    1、关于适配器模式

    适配器模式(Adapter Pattern)又称为变压器模式,是 GoF 的 23 种设计模式中的一种结构型设计模式。

    适配器模式 的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作

    2、关于适配器模式的构成

    适配器模式一般包含三种角色:

    1. 目标(Target):目标是一个接口,该接口是客户想要使用的接口。
    2. 被适配者(Adaptee):被适配者是一个已经存在的接口或抽象类,这个接口或抽象类需要被适配。
    3. 适配器(Adapt):适配者是一个类,该类实现了目标接口并包含有适配者的引用,即适配者的职责是对被适配者接口(抽象类)与目标接口进行适配。
    3、关于适配器模式的UML
    适配器模式
    4、关于适配器类
    public class Adapter extends Adaptee implements Target{
        @Override
        public void request() {
            //...一些操作...
            super.adapteeRequest();
            //...一些操作...
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    5、关于适配器模式的优缺点

    # 适配器模式优点

    • 可以让任何两个没有关联的类一起运行。
    • 提高了类的复用。
    • 增加了类的透明度。
    • 灵活性好。

    # 适配器模式缺点

    • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
    • 由于 Java 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

    # 使用场景

    • 有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

    二、适配器的实现 Demo

    1、Demo 设计

    我们新买了一个华为 mate50 手机,但是来朋友家做客没携带充电器,朋友家只有 Ios 的充电器,所以我们需要让 Ios 充电接口支持我们的 mate50 的 Type-C 充电。

    2、Demo 实现

    # TypeCharger 目标(Target)

    /**
     * Type-c充电接口
     **/
    public interface TypecCharger {
    
        /**
         * 充电方法
         */
        void typecCharger();
    }
     
    /**
     * Type-c充电
     **/
    public class Typec implements TypecCharger {
        
        @Override
        public void typecCharger() {
            System.out.println("Type-c接口充电");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    # IosCharger 被适配者(Adaptee)

    /**
     * Ios充电接口
     **/
    public interface IosCharger {
        /**
         * 充电方法
         */
        void iosCharger();
    }
     
    /**
     * Ios充电
     **/
    public class Ios implements IosCharger {
        
        @Override
        public void iosCharger() {
            System.out.println("Ios接口充电");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    # FriendHome

    /**
     * 在朋友家充电(只有Ios充电口)
     **/
    public class FriendHome {
        private IosCharger iosCharger;
    
        public FriendHome(IosCharger iosCharge) {
            this.iosCharger = iosCharge;
        }
    
        /**
         * 充电
         */
        public void charge(){
            this.iosCharger.iosCharger();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    # ChargerAdapter 适配器(方式一)

    /**
     * 适配器接口
     **/
    public class ChargerAdapter implements IosCharger {
        
        private TypecCharger typec;
    
        public ChargerAdapter(Typec typec) {
            this.typec = typec;
        }
    
        @Override
        public void iosCharger() {
            typec.typecCharger();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    # ChargerAdapter 适配器(方式二)

    public class ChargerAdapter extends Typec implements IosCharger {
    
        @Override
        public void iosCharger() {
            this.typecCharger();
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    3、Demo 测试
    public class Client {
    
        public static void main(String[] args) {
            // 原本只有 Ios 充电口
            FriendHome home = new FriendHome(new Ios());
            home.charge();
    
            System.out.println("*******************");
    
            // 使用适配器之后旅馆支持ios充电了
            ChargerAdapter chargerAdapter = new ChargerAdapter(new Typec());
            home = new FriendHome(chargerAdapter);
            home.charge();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    【牛客网面试必刷TOP101】链表篇(一)
    ELK+Filebeat经典架构部署
    全链路压测(5):生产全链路压测实施全流程
    【漏洞复现】SpringBlade dict-biz SQL注入漏洞
    C# Winform串口助手
    第七章 数学 6 AcWing 1593. 整数分解
    【Rust日报】2022-11-08 bless.rs: 带你走入 Rust 生态
    机器学习02:模型评估
    Flux、Atomic、Proxy 不同心智模型状态管理库的比较和原理
    【前端源码解析】AST 抽象语法树
  • 原文地址:https://blog.csdn.net/weixin_45187434/article/details/128085445