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

news2024/11/27 14:47:27

目录标题

  • 1. 前言
  • 适配器模式
    • 1. 概述
    • 2. 结构
    • 3. 实现
      • 3.1 类适配器模式( 继承)--耦合度高
        • 代码实现
      • 3.2 对象适配器模式(聚合)
        • 代码实现
      • 类适配器与对象适配器的区别
    • 4. 适配器模式的优缺点

1. 前言

结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。
由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。

结构型模式分为以下 7 种:

  1. 代理模式
  2. 适配器模式
  3. 装饰者模式
  4. 桥接模式
  5. 外观模式
  6. 组合模式
  7. 享元模式

适配器模式

1. 概述

如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供我们充电,这样使得我们的插头在当地能使用。生活中这样的例子很多,手机充电器(将220v转换为5v的电压),读卡器等,其实就是使用到了适配器模式。
在这里插入图片描述

定义
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高。

2. 结构

源(Adaptee):需要被适配的对象或类型,相当于插头。
目标(Target):期待得到的目标,相当于插座。
适配器(Adapter):连接目标和源的中间对象,相当于插头转换器。

3. 实现

3.1 类适配器模式( 继承)–耦合度高

适配器继承源,实现目标。

从下面的结构图可以看出,Adaptee类并没有method2()方法,而客户端则期待这个方法。为使客户端能够使用Adaptee类,我们把Adaptee与Target衔接起来。Adapter与Adaptee是继承关系,这决定了这是一个类适配器模式。
在这里插入图片描述

代码实现

源:

public class Adaptee {
    public void method1(){
        System.out.println("method 1");
    }
}

目标:

public interface Target {
    void method1();
    void method2();
}

适配器类:

public class Adapter extends Adaptee implements Target {
    @Override
    public void method2() {
        System.out.println("method 2");
    }
}

测试类:

class AdapterTest {
    public static void main(String[] args) {
        Adapter adapter = new Adapter();
        adapter.method1();
        adapter.method2();
    }
}

运行结果:

method 1
method 2

3.2 对象适配器模式(聚合)

适配器聚合源,实现目标。

从下面的结构图可以看出,Adaptee类并没有method2()方法,而客户端则期待这个方法。与类适配器模式一样,为使客户端能够使用Adaptee类,我们把Adaptee与Target衔接起来。但这里我们不继承Adaptee,而是把Adaptee封装进Adapter里。这里Adaptee与Adapter是组合关系。
在这里插入图片描述

代码实现

Target和Adaptee和上面的类适配器一样,不再贴出。
适配器类:

public class Adapter implements Target {

    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void method1() {
        adaptee.method1();
    }

    @Override
    public void method2() {
        System.out.println("method 2");
    }

}

测试类:

class AdapterTest {
    public static void main(String[] args) {
        Adapter adapter = new Adapter(new Adaptee());
        adapter.method1();
        adapter.method2();
    }
}

运行结果:

method 1
method 2

类适配器与对象适配器的区别

类适配器使用的是继承的方式,直接继承了Adaptee,所以无法对Adaptee的子类进行适配。

对象适配器使用的是组合的方式,所以Adaptee及其子孙类都可以被适配。另外,对象适配器对于增加一些新行为非常方便,而且新增加的行为同时适用于所有的源。

基于组合/聚合优于继承的原则,使用对象适配器是更好的选择。但具体问题应该具体分析,某些情况可能使用类适配器会适合,最适合的才是最好的。

4. 适配器模式的优缺点

优点
更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
更好的扩展性:在实现适配器功能的时候,可以扩展自己源的行为(增加方法),从而自然地扩展系统的功能。
缺点
会导致系统紊乱:滥用适配器,会让系统变得非常零乱。例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

来源:https://blog.csdn.net/mrkohaku/article/details/79087688

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

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

相关文章

Borland Delphi 2005对Delphi语言的支持

Borland Delphi 2005对Delphi语言的支持 Borland Delphi是Borland Delphi的最新版本,它为用户的Microsoft Windows操作系统和1.1本身的Microsoft.NET Framework版本提供了快速应用程序开发。Delphi Borland 2005被认为具有主要的三个不同的字符,如Win32…

目标检测论文解读复现之十五:基于YOLOv5的光学遥感图像舰船 目标检测算法

前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文&#xff0…

关于商业智能BI,今天只谈这五点

数据在当下的价值不断提高,但数据本身只是一种资产,一旦超过一定数据量就很难被人类理解,所以想要利用数据,就必须将数据转化为信息和知识,让管理者看到的是信息,而不是数据堆砌。 之前的文章里写过很多关…

打了10次电话,才总结出来的抖音封号原因分析,能避免大量封号

真正做过视频的人,应该是经常会面对封号 ,如果你号都没有封过,说明你还没有真正开始过 。这个话不是我讲的,是和一个日入3万的大V聊天,他说给我听的。你觉得这话对么?无论任何平台 ,都不会无缘无故封你号 ,平台需要大量的作者去生成内容 ,在符…

马来酰亚胺聚谷氨酸天冬氨酸聚合物药物载顺铂/mPEg-PGA纳米微球的制备

小编在此整理了马来酰亚胺聚谷氨酸天冬氨酸聚合物药物载顺铂/mPEg-PGA纳米微球的制备步骤,与小编一同来看! 载顺铂mPEg-PGA纳米微球的制备: 采用生物相容性好,生物可降解的mPEG-PGA聚合物作为药物载体,通过膜透析法制备了负载顺铂纳米微球,以…

CAN总线在OSI模型中层级

ISO14229-1仅规定了应用层的实现,诊断可以基于不同的总线去实施,以基于CAN的UDS最为广泛。本文开始将陆续介绍CAN总线协议的规范与开发。 关联文章:UDS的OSI模型 文章目录OSI模型与CAN的关系在各层中CAN定义事项CAN总线网络ISO11898 和 ISO…

如何保证优秀的医疗器械设计?

如何保证优秀的产品设计?医疗器械设计领域的出现不是一蹴而就的,而是经历了时间的沉淀。 医疗设备的设计责任重大。这些产品有机会改变和拯救生命。它们可以在市场上销售几年或更长时间,这将影响人们管理自己或他人健康的方式。所以,医疗产品…

报错与解决 | 应用程序无法启动0x7b mysql

文章目录报错解决办法成功解决问题报错 根据“MySQL下载安装使用-完整详细步骤”下载安装好MySQL后,以管理员身份启动cmd,输入: "D:\mysql\mysql-5.7.31-winx64\bin \mysqld.exe" --initialize-insecure # 自己的mysql安装目录 …

C语言easyx颜色模块+案例

c语言exsyx学习颜色模型rgbhsvhsv转换为rgb案例 绘制彩虹窗体案例 绘制天空和彩虹画面颜色模型 1.1 什么是RGB颜色模型 不知道你有没有近距离看过各种电子显示屏。若非常近距离的观察电子显示屏,可以发现屏幕居然是由 一个一个的红色、绿色、蓝色的小点组成。 红…

毕业设计 - SSM中药店商城系统(含源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.3 系统结构设计4 项目获取1 项目简介 Hi,各位同学好呀,这里是M学姐! 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品,【基于SSM的中药店商…

半年销售100万辆 关注比亚迪后300万时代

11月16日,比亚迪第300万辆新能源汽车下线发布在比亚迪全球总部举行,标志着比亚迪成为首个达成这一里程碑的中国品牌。从“第1辆新能源汽车到第100万辆新能源汽车”用时13年、从“100万到200万”用时1年,从“200万到300万”仅用时半年&#xf…

HTML5——周技能检测——菜单编辑——2022年11月22日(考完)

HTML5——周技能检测——菜单编辑——2022年11月22日(考完) 一、语言和环境 1. 实现语言:HTML5。 2. 开发环境:VScode。 二、要求 1、完成下列菜单显示效果。 2、添加【:hover】选择器,鼠标悬停在文字上方时文字…

全面详解云计算

【导读】本文从企业IT建设发展痛点解析入手,从云计算的标准定义、云平台分类、云计算优劣势分析,到企业规模、业务类型与云平台适用以及企业上云流程简析,全面详解云计算,结合作者的思考和观点,为读者认识云计算提供一个全景式的概貌。 前言 大数据、人工智能、云计算可…

C++ 手动实现双线链表(作业版)

双向链表&#xff0c;并实现增删查改等功能 首先定义节点类&#xff0c;类成员包含当前节点的值&#xff0c; 指向下一个节点的指针和指向上一个节点的指针 //节点定义 template <typename T> class Node { public:Node<T>* prior;T value;Node<T>* next;N…

Python对Excel的读取

在python自动化中&#xff0c;经常会遇到对数据文件的操作&#xff0c;比如添加多名员工&#xff0c;但是直接将员工数据写在python文件中&#xff0c;不但工作量大&#xff0c;要是以后再次遇到类似批量数据操作还会写在python文件中吗&#xff1f; 应对这一问题&#xff0c;可…

【OpenDDS开发指南V3.20】第七章:运行时配置

配置方式 OpenDDS 包括一个基于文件的配置框架,用于配置全局选项以及与特定发布者和订阅者相关的选项,例如发现和传输配置。 OpenDDS 还允许通过命令行对有限数量的选项和配置 API 进行配置。 本章总结了 OpenDDS 支持的配置选项。 OpenDDS 配置涉及三个主要领域: 通用配…

QT 实现简单的天气 哈哈

前 言 前段时间开始接触QT&#xff0c;想着没事学习一下QT&#xff0c;这个小列子主要是用到了QJSON 和QNetworkAccessManager 来实现&#xff0c;QJSON 主要是用来json格式文件的解析&#xff0c;QNetworkAccessManager 主要来实现网络请求。 界面展示 界面上看非常low&…

解决java: 程序包org.springframework.boot不存在的解决方法

问题描述 最近IDEA抽风了&#xff0c;不管是新建SpringBoot工程&#xff0c;还是导入项目。 IDEA代码里面都会飘红~ Build项目时&#xff0c;会提示错误&#xff1a;错误:(3, 32) java: 程序包org.springframework.boot不存在 后来找到一个靠谱的解决方案&#xff0c;建议使…

Java如何安装https证书

Java为什么需要证书&#xff1f; 出于安全的考虑&#xff0c;很多网站都使用https 协议&#xff0c;而要访问一个https 的站点则需要一个证书文件&#xff0c;这些证书文件由CA (Certificate Authority) 颁布&#xff0c; 各站点将这些认证过的证书放在各自的服务器上&#xf…

深度解析:为何在 SwiftUI 视图的 init 初始化器里无法更改 @State 的值?

问题现象 如下代码所示,我们希望用 “hopy” 初始化 ContentView 中的 secret 属性,但是最终 ContentView 显示时, secret 的值仍旧为默认值 “none” ! 为什么会出现这种情况呢? 其实答案就在 @State 包装器属性内部实现机制上,它比表面看起来要复杂那么一丢丢。 在本…