【设计模式-3.2】结构型——适配器模式

说明:本文介绍设计模式中结构型设计模式中的,适配器模式;

插头转换器

适配器模式属于结构型设计模式,设计思想体现在结构上的。以插头转换器为例,当你需要给手机充电,但是眼前只有一个三孔插座,二脚充电器无法使用三孔插座。

这时如果有一个插头转换器,可以将二孔插头转为三脚插头,就可以解决眼前问题。这个转换器扮演的就是适配器的角色。如下:

(TwoPin,二脚插座接口,只提供二脚插头充电)

/**
 * 二脚插座
 */
public interface TwoPin {

    /**
     * 二脚充电
     */
    public void charge(int l, int r);
}

(ThreePin,三脚插座接口,只提供三脚插头充电)

/**
 * 三脚插座
 */
public interface ThreePin {

        /**
        * 三脚充电
        */
        public void charge(int l, int r, int g);
}

(Phone,手机,充电器属于二脚插头)

/**
 * 手机
 */
public class Phone implements TwoPin{

    @Override
    public void charge(int l, int r) {
        System.out.println("手机充电中..." + l + "====" + r);
    }
}

(客户端类,演示手机充电过程,二孔插头无法插入三孔插座,类型错误)

在这里插入图片描述

为了解决上面问题,我们可以创建一个适配器类,用来适配手机类使用三孔插座,如下:

/**
 * 适配器
 */
public class Adapter implements ThreePin{

    /**
     * 适配器持有手机对象
     */
    private Phone phone;

    /**
     * 适配手机使用三脚插座
     * @param l
     * @param r
     * @param g
     */
    @Override
    public void charge(int l, int r, int g) {
        phone.charge(l, r);
    }
}

(Client,客户端,演示手机使用三脚插座)

/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        // 借助适配器,手机使用三脚插座充电
        Phone phone = new Phone();
        new Adapter(phone).charge(1, 1, 0);
    }
}

借助适配器,手机就可以使用三脚插座了;

在这里插入图片描述

专属适配器

当我们想让该适配器专属于手机,而不给其他类使用时,我们可以通过继承的方式来实现。

如下:

(Phone,手机类,给手机一个name属性,表示手机的名称)

/**
 * 手机
 */
public class Phone implements TwoPin{

    /**
     * 手机名称
     */
    protected String name;

    public Phone(String name) {
        this.name = name;
    }

    @Override
    public void charge(int l, int r) {
        System.out.println(name + ":手机充电中..." + l + "====" + r);
    }
}

(PhoneAdapter,手机专属适配器,继承于手机,实现三脚插座接口)

/**
 * 手机专属适配器
 */
public class PhoneAdapter extends Phone implements ThreePin{

    /**
     * 适配器持有手机对象
     */
    private Phone phone;

    public PhoneAdapter(Phone phone) {
        super(phone.name);
        this.phone = phone;
    }

    @Override
    public void charge(int l, int r, int g) {
        System.out.println(name + ":在使用专属的适配器给手机充电...");
        super.charge(l, r);
    }

(Client,客户端,演示小米手机使用手机专属的适配器,用三孔插座充电)

/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        // 小米手机使用手机专属的适配器,用三孔插座充电
        Phone phone = new Phone("小米手机");
        new PhoneAdapter(phone).charge(1, 1, 0);
    }
}

在这里插入图片描述

双向适配器

双向适配器,就是该适配器对二孔插头、三孔插头的充电器都可以适配,如下:

在这里插入图片描述

代码实现如下:

(MultipleAdapter,多重适配器,实现两个接口,注入两个对象,创建对应的两个构造方法)

/**
 * 多重适配器
 */
public class MultipleAdapter implements ThreePin, TwoPin{

    /**
     * 三孔插座
     */
    private ThreePin threePin;

    /**
     * 二孔插座
     */
    private TwoPin twoPin;

    public MultipleAdapter(ThreePin threePin) {
        this.threePin = threePin;
    }

    public MultipleAdapter(TwoPin twoPin) {
        this.twoPin = twoPin;
    }

    /**
     * 三孔插座充电
     * @param l
     * @param r
     * @param g
     */
    @Override
    public void charge(int l, int r, int g) {
        this.twoPin.charge(l, r);
    }

    /**
     * 二孔插座充电
     * @param l
     * @param r
     */
    @Override
    public void charge(int l, int r) {
        this.threePin.charge(l, r, 0);
    }
}

(Computer,创建一个电脑类,使用三孔插座的)

/**
 * 电脑
 */
public class Computer implements ThreePin{

    /**
     * 电脑名称
     */
    protected String name;

    public Computer(String name) {
        this.name = name;
    }

    @Override
    public void charge(int l, int r, int g) {
        System.out.println(name + ":充电中..." + l + "====" + r + "====" + g);
    }
}

(Client,客户端,演示手机、电脑使用多重适配器给手机充电)

/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        // 电脑使用多重适配器,用二孔插座充电
        Computer computer = new Computer("联想电脑");
        new MultipleAdapter(computer).charge(1,1);

        // 手机使用多重适配器,用三孔插座充电
        Phone phone = new Phone("小米手机");
        new MultipleAdapter(phone).charge(1,1,0);
    }
}

(不论是二孔插头还是三孔插头,都行)

在这里插入图片描述

以上就是适配器模式的内容,适配的思想还是非常常见的,在Java中,方法重载不正是适配器模式在方法上的一种体现吗?而适配器模式,是在类的层面上,对多种类、对象之间的一种适配。

总结

本文参考《设计模式的艺术》、《秒懂设计模式》两书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/231520.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MES管理系统在非标制造企业中的应用

在当今制造业中,非标制造企业逐渐成为一种重要的存在。与传统的批量生产制造企业不同,非标制造企业主要特点是能够根据客户需求进行定制化生产。这种定制化的生产模式对企业的管理提出了更高的要求,同时也带来了更多的挑战。在非标制造企业中…

Emacs之Plantuml用于复杂UML类图(Markdown用于简单类图)(一百三十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

MQTT主题、通配符和最佳实践

MQTT主题在MQTT生态系统非常重要,因为代理(broker)依赖主题确定哪个客户端接收指定的主题。本文我们将聚集MQTT主题、MQTT通配符,详细讨论使用它们的最佳实践,也会探究SYS主题,提供给代理(broke…

超越极限!如何进行高效分布式性能测试,让Jmeter揭示并发下系统的真正实力

一、为什么要进行分布式性能测试 当进行高并发性能测试的时候,受限于Jmeter工具本身和电脑硬件的原因,无法满足我们对大并发性能测试的要求。 基于这种场景下,我们就需要采用分布式的方式来实现我们高并发的性能测试要求。 二、分布式性能测…

深度学习记录--激活函数

激活函数的种类 对于激活函数的选择,通常有以下几种 sigmoid,tanh,ReLU,leaky ReLU 激活函数的选择 之前logistic回归一直使用的激活函数都是sigmoid函数,但一般来说,tanh函数是比sigmoid函数更加好的选…

【小白专用】在 vs 中使用 nuget 安装NPOI

C#操作Excel有多种方法,如通过数据库的方式来读写Excel的OleDb方式,但是OleDb方式需要安装微软office,还可以通过COM组件方式操作Excel,也需要安装微软Excel。如果不想安装微软办公套餐可以使用ClosedXML、EPPlus、NPOI。本文主要…

理解IoC容器初始化

问题:当自己面试或者背诵八股文时,会背到各种各样的spring底层的东西,自己越看越迷糊。 OS:不知道兄弟们是不是也会这样?如果大家没有说明我太菜了。 原因:就是自己学的框架越来越多,很多框架…

线性回归实战

3.1 使用正规方程进行求解 3.1.1 简单线性回归 公式 : y w x b y wx b ywxb 一元一次方程,在机器学习中一元表示一个特征,b表示截距,y表示目标值。 使用代码进行实现: 导入包 import numpy as np import matp…

bc-linux-欧拉重制root密码

最近需要重新安装虚拟机的系统 安装之后发现对方提供的root密码不对,无法进入系统。 上网搜了下发现可以进入单用户模式进行密码修改从而重置root用户密码。 在这个界面下按e键 找到图中部分,把标红的部分删除掉,然后写上rw init/bin/…

JAVEE初阶 多线程基础(七)

懒汉模式 指令重排序问题 一. 懒汉模式的意义和代码实现二. 饿汉模式和懒汉模式的线程安全三. 懒汉模式的线程安全问题解决3.1 加锁阶段3.2 嵌套if阶段3.3 指令重排序问题3.4 解决线程安全问题阶段 一. 懒汉模式的意义和代码实现 在上一章节中,我们先学习了单例模式中的饿汉模式…

【好书推荐】《深入Activiti流程引擎:核心原理与高阶实战》

学习工作流,推荐贺老师的书《深入Activiti流程引擎:核心原理与高阶实战》,对系统学习和深入掌握Activiti/Flowable流程引擎的用法非常有帮助。 图书链接

我的NPI项目之Android电源系列 -- 关于剩余充满时间的问题(一)

我的新项目是基于高通最新的5G平台,但是由于还没有拿到EVT。所以,就在目旧的平台和OS上进行学习。遇到第一个问题就是插上type-c之后,充满剩余时间异常的问题。 问题描述,在充电过程中,显示充满时间为“0 min left unt…

基于EIoT能源物联网的智能照明系统应用改造-安科瑞 蒋静

【摘要】:随着物联网技术的发展,许多场所针对照明合理应用物联网照明系统,照明作为工厂的重要能耗之一,工厂的照明智能化控制,如何优化控制、提高能源的利用率,达到节约能源的目的。将互联网的技术应用到工…

MCS-51系列与AT89C5x系列单片机的介绍与AT系列的命名规则

MCS-51系列与AT89C5x系列单片机 主要涉及MCS-51系列与AT89C5x系列单片机的介绍与AT系列单片机的命名规则 文章目录 MCS-51系列与AT89C5x系列单片机一、 MCS-51系列单片机二、AT89C5x系列单片机2.1 AT89C5x/AT89S5x系列单片机的特点2.2 AT89系列单片机的型号说明2.2.1 前缀2.2.2…

PyTorch: 基于VGG16处理MNIST数据集的图像分类任务

引言 在本博客中,小编将向大家介绍如何使用VGG16处理MNIST数据集的图像分类任务。MNIST数据集是一个常用的手写数字分类数据集,包含60,000个训练样本和10,000个测试样本。我们将使用Python编程语言和PyTorch深度学习框架来实现这个任务。 在Conda虚拟环…

【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组

🌈个人主页:聆风吟 🔥系列专栏:数据结构、剑指offer每日一练 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️寻找文件副本(题目难度:简单)1.1 题目1.2 示例1.3 限制1.4 解题思路一c代…

【链表OJ—分割链表】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1、分割链表题目: 方法讲解: 图文解析: 代码实现: 总结 前言 世上有两种耀眼的光芒,一种是正在升起的太…

坚鹏:中国工商银行浙江大学金融业务转型与场景营销策略培训

中国工商银行打造D-ICBC数字化转型战略,围绕“数字生态、数字资产、数字技术、数字基建、数字基因”五维布局,深入推进数字化转型,加快形成体系化、生态化实施路径,促进科技与业务加速融合,以“数字工行”建设推动“GB…

【父子进程/AES/XTEA/SMC】赛后复盘

官方wp: 进程重影技术: 进程重映像利用了Windows内核中的缓存同步问题,它会导致可执行文件的路径与从该可执行文件创建的映像节区所报告的路径不匹配。通过在一个诱饵路径上加载DLL,然 后卸载它,然后从一个新路径加载它&#x…

SQL语言重温

数据库语言重温 笔记背景SQL教程一些最重要的 SQL 命令SQL WHERE 子句SQL AND & OR 运算符SQL ORDER BY 关键字 笔记背景 由于工作需要,现重温简单SQL语言,笔记记录如下。 SQL教程 SQL(Structured Query Language:结构化查询语言&…