适配器模式知多少

news2024/10/7 16:26:34

目录

目标

概述

实战


目标

熟悉适配器设计模式,了解适配器设计模式的使用场景、具体实现。


概述

一、结构型设计模式

结构型设计模式是设计模式的一种类型。它的关注点在于如何将对象和类组合成更大的结构。较为常见的结构型设计模式如:装饰者设计模式、代理模式、适配器模式、桥接模式、组合模式等。

二、适配器设计模式

旨在解决两个两个接口不兼容的问题。通过适配器将一个类的接口转换成客户期望的另一个接口,从而让两个不兼容的接口协同工作。生活中也有类似的案例:超薄笔记本连接网线需要转接头(相当于适配器),手机充电线接头或耳机接头也会应为型号不兼容手机而使用转接头(相当于适配器)。

优点:

  • 实现代码复用。
  • 降低系统耦合。
  • 不需要修改代码就可以使用新接口。

缺点:

  • 该模式需要引入适配器对象,增加了代码复杂度和运行开销。
  • 不适用于经常变化的接口,因为接口的变化会导致适配器类需要修改。

三、使用场景

  • 系统升级或重构时,旧接口无法满足新需求时。
  • 系统集成时,多个接口集成为一个接口时。
  • 要将一个类与其他类协同工作,但是其他类的接口不兼时。

四、列举适配器模式在成熟的框架中的应用

  • Hibernate中的JDBC适配器。
  • Netty的ChannelHandler接口和 ChannelHandlerAdapter类实现了适配器模式,通过适配器模式,可以灵活的实现自定义的ChannelHandler。
  • MyBatis中的TypeHandler是一个接口,用于将Java对象转换成JDBC可用的类型。当我们自定义TypeHandler来处理一些特殊的类型。这时候就可以使用适配器模式。
  • Spring MVC中默认的处理器映射器只能处理标准的HTTP请求,无法处理自定义的请求。为了解决这个问题,Spring MVC提供了适配器来将自定义的Controller适配成标准的处理器。

五、适配器模式和装饰者模式的区别

装饰者模式适配器模式
目的在运行时根据业务,动态地给对象新增额外功能。强调增强性。把一个接口转换成另一个接口。强调兼容性。
封装装饰者封装被装饰者,比如:在糖、盐和咖啡这三者中,咖啡是被装饰者,糖和盐是装饰者。适配器封装的是另一个对象的接口,用于转换接口。
实现方式通过装饰者和被装饰者之间的组合实现。通过对象适配器和类适配器实现。

实战

需求

水果供应商公司提供苹果和桔子,它们有各自的包装盒。但是苹果的包装盒用完了,桔子包装盒还有剩余。为了避免浪费,需要把剩余的桔子包装盒转换成适合苹果包装盒的标准。

苹果包装盒和桔子包装盒接口

package com.ctx.adapter;

/**
 * 苹果包装盒接口(默认只能包装苹果)
 */
public interface AppleBox {
    public void pack(String type);
}
package com.ctx.adapter;

/**
 * 桔子包装盒接口(默认只能包装桔子)
 */
public interface OrangeBox {
    public void pack(String type);
}

桔子包装盒适配器类

package com.ctx.adapter;

import com.ctx.adapter.impl.AppleBoxImpl;

/**
 * 桔子包装盒适配器类
 */
public class OrangeBoxAdapter implements OrangeBox {
    AppleBoxImpl appleBoxImpl;
    public OrangeBoxAdapter(String type){
        if(type.equalsIgnoreCase("apple") ){
            appleBoxImpl =new AppleBoxImpl();
        }
    }

    @Override
    public void pack(String type) {
        if(type.equalsIgnoreCase("apple")){
            appleBoxImpl.pack(type);
        }
    }
}

苹果包装盒和桔子包装盒实现类

package com.ctx.adapter.impl;

import com.ctx.adapter.AppleBox;

public class AppleBoxImpl implements AppleBox {
    /**
     * 包装方法
     * @param type
     */
    @Override
    public void pack(String type) {
        if(type.equalsIgnoreCase("apple")){
            System.out.println("包装盒包装:苹果");
        }
    }
}
package com.ctx.adapter.impl;

import com.ctx.adapter.OrangeBoxAdapter;
import com.ctx.adapter.OrangeBox;

public class OrangeBoxImpl implements OrangeBox {
    OrangeBoxAdapter orangeBoxAdapter;
    /**
     * 包装方法
     * @param type
     */
    @Override
    public void pack(String type) {
        if(type.equalsIgnoreCase("orange")){
            System.out.println("包装盒包装:桔子");
        }
        //OrangeAdapter提供了包装苹果的支持
        else if(type.equalsIgnoreCase("apple") ){
            orangeBoxAdapter = new OrangeBoxAdapter(type);
            orangeBoxAdapter.pack(type);
        }
    }
}

测试调用

package com.ctx.adapter;

import com.ctx.adapter.impl.OrangeBoxImpl;

public class Test {
    public static void main(String[] args) {
        OrangeBoxImpl orangeBox = new OrangeBoxImpl();
        orangeBox.pack("orange");
        orangeBox.pack("apple");
    }
}

输出 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源物联网平台和智能家居平台

开源物联网平台和智能家居平台 目 录 1、开源智能家居平台(家庭自动化工具) 1. Home Assistant2. openHAB3. Domoticz4. Calaos2、开源物联网平台 1. Thingsboard2. Kaa IoT Platform3. SiteWhere4. JetLinks5. Thinger.io 做者:晨星1032 1…

把握数据核心,A/B测试成就高效邮件营销新纪元

电子邮件营销是现代营销战略中的重要组成部分。但是收件人每天要收到大量的邮件,而确保你的电子邮件有效和吸引人是一件具有挑战性的事情。想要克服这个问题,提高电子邮件营销活动有效性是一个不错的方法。具体措施就是进行A/B测试!在本文中&…

啥是CTF?新手如何入门CTF?

CTF是啥 CTF 是 Capture The Flag 的简称,中文咱们叫夺旗赛,其本意是西方的一种传统运动。在比赛上两军会互相争夺旗帜,当有一方的旗帜已被敌军夺取,就代表了那一方的战败。在信息安全领域的 CTF 是说,通过各种攻击手…

NIO简单入门笔记【一】 三大组件

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏 JAVA专栏 📧如果文章知识点有错误的地方,请指正&…

Python 基础(十三):函数

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录 一、创建函数二、调用函数三、向函数传递参数3.1、形参和实参3.2、多参函数3.3、参数的…

【C生万物】 指针和数组笔试题汇总 (上)

欢迎来到 Claffic 的博客 💞💞💞 👉 专栏:《C生万物 | 先来学C》👈 前言: 在学习完初级和进级的指针之后,为了检验掌握程度,这里出一期指…

MYSQL 之 Redis配置与优化

(一)关系数据库和非关系数据库 关系库数据库Oracle ,mysql ,sql,server,microsoft Access ,postgresql 以上数据库必须先建表在设计表的结构,然后存储的时侯按表的结构去存&#x…

微信小程序入门01-工具的下载安装及模板的安装

小程序开发现在已经有多种模式了,有使用uniapp开发的,使用微信开发者工具开发的,还有低代码工具也支持开发小程序的。 在众多开发模式中,使用官方开发者工具开发也是一种形式。本篇我们就介绍一下如何用微信开发者工具搭建小程序…

【MATLAB第32期】基于MATLAB的降维/全局敏感性分析/特征排序/数据处理分类问题MATLAB代码实现(持续更新)

【MATLAB第32期】基于MATLAB的降维/全局敏感性分析/特征排序/数据处理分类问题MATLAB代码实现(持续更新) 本文敏感性分析主要分析分类问题(fisher、rf、arf、nca等)。 一、降维方法(分类) 常见的降维方法: 常见的敏…

2023,8种必备Selenium编写自动化用例的技巧(建议收藏)

在开始自动化时,您可能会遇到各种可能包含在自动化代码中的方法,技术,框架和工具。有时,与提供更好的灵活性或解决问题的更好方法相比,这种多功能性导致代码更加复杂。在编写自动化代码时,重要的是我们能够…

Jangow

Jangow 1.环境准备 靶场地址:https://www.vulnhub.com/entry/jangow-101,754/下载好靶机之后直接使用VMware Workstation Pro虚拟机导入环境,启动即可,将网段设置为NAT模式攻击机:kali(192.168.80.180)靶…

【电厂用 多功能数码显示 HJY-F931B/D交流三相电压继电器JOSEF约瑟】

用途 HJY系列数字式交流电压继电器为瞬时动作特性,用于发电机,变压器,输电线路的继电保护装 置中作为过压或欠压的闭锁启动元件。 安装结构 导轨安装9,导轨安装E两种结构方式,具体尺寸请参考外型尺寸图。特点 (1). 采…

局域网内使用的多人协同编辑文档的软件哪个好?对比5款主流平台

支持局域网内多人协同编辑文档的软件或平台哪个好?PingCode 、Confluence 等知识库工具和腾讯文档、飞书文档等都支持多人协作编辑,怎么选?这是企业团队在找文档管理工具最常见的问题。 支持局域网内协同编辑的软件可以分为两个大类&#xf…

azkaban介绍

目录 为什么需要工作流调度系统 什么是azkaban azkaban适用场景 azkaban特点 常见的工作流调度系统 azkaban和Ooize特性对比 azkaban的架构 azkaban调度的任务有可能有那些类型 总结 为什么需要工作流调度系统 一个完整的大数据分析系统,必然由很多任务单…

基于显扬科技3D视觉相机的医疗试管分拣系统

行业现状: 医疗试管分拣是医疗行业中的一个重要环节,指将医疗实验室或生物技术研究中的试管按照一定的规则进行分拣,并对试管的类型、位置、数量等信息进行识别和管理。 随着医疗技术的不断发展和诊断治疗的精细化,医疗试管分拣…

Python之selenium关于Chrome驱动位置和闪退的问题

目录 一、Chromedriver放置的位置二、浏览器闪退 一、Chromedriver放置的位置 背景:之前由于Chrome浏览器自动升级后,导致驱动与浏览器不匹配,自己也不知道问题出在哪儿,花费了我大量时间去排查,所以接下来记录一些。…

Linux ps -A 和 ps -ef

Linux ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器 ps -A | grep xx 显示xx所有的进程 ps -ef | grep xx 显示xx在一个终端的所有进程 注意这里ef 其实可以拆开理解 e 是显示所有进…

oracle报错ORA-12514

问题:oracle使用服务名orcl登录不成功,并且报错 ORA-12514, TNS:listener does not currently know of service requested in conn原因分析: ORA-12514 错误通常表示 Oracle 数据库监听器无法识别客户端请求的服务名称。这可能是由于以下原因…

什么是ERP、APS和MES

01 先来说说ERP与MES的区别 ERP:企业资源计划 一天中午,丈夫在外给家里打电话:“亲爱的老婆,晚上想带几个同事回家吃饭可以吗?”(订货意向) 丈夫:“6个人,我们7点左右回…

【计算机视觉】如何利用 CLIP 做简单的人脸任务?(含源代码)

文章目录 一、数据集介绍二、源代码 结果三、代码逐行解读 一、数据集介绍 CELEBA 数据集(CelebFaces Attributes Dataset)是一个大规模的人脸图像数据集,旨在用于训练和评估人脸相关的计算机视觉模型。该数据集由众多名人的脸部图像组成&a…