设计模式之适配器模式笔记

news2024/12/23 3:16:33

设计模式之适配器模式笔记

  • 说明
  • Adapter(适配器)
  • 目录
  • 类适配器模式示例类图
    • 适配者类的接口
    • 适配者类
    • 目标接口
    • 具体的SD卡类
    • 计算机类
    • 适配器类
    • 测试类
  • 对象适配器模式
    • 适配者类的接口
    • 适配者类
    • 目标接口
    • 具体的SD卡类
    • 计算机类
    • 适配器类
    • 测试类

说明

记录下学习设计模式-适配器模式的写法。JDK使用版本为1.8版本。

Adapter(适配器)

意图:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
结构:
在这里插入图片描述

其中:

  • Target定义Client使用的与特定领域相关的接口。
  • Client与符合Target接口的对象协同。
  • Adaptee定义一个已经存在的接口,这个接口需要适配。
  • Adapter对Adaptee的接口与Target接口进行适配。

适用性:

  • 想使用一个已经存在的类,而它的接口不符合要求。
  • 想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
  • (仅适用于对象Adapter)想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

应用场景:
1.以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
2.使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

目录

类适配器模式示例类图

现有一台电脑只能读取SD卡,而要读取TF卡中的内容的话就需要使用到适配器模式。创建一个读卡器,将TF卡中的内容读取出来。类图如下:
在这里插入图片描述

以该UML类图实现类适配器模式示例。

适配者类的接口

package com.example.deesign_patterns.adapter.class_adapter;

//适配者类的接口
public interface TFCard {

    //从TF卡中读取数据
    String readTF();

    //往TF卡中写数据
    void writeTF(String msg);
}

适配者类

package com.example.deesign_patterns.adapter.class_adapter;

//适配者类
public class TFCardImpl implements TFCard{

    @Override
    public String readTF() {
        String msg="TFCard read msg:hello world";
        return msg;
    }

    @Override
    public void writeTF(String msg) {
        System.out.println("TFCard write msg:"+msg);
    }
}

目标接口

package com.example.deesign_patterns.adapter.class_adapter;

//目标接口
public interface SDCard {

    //从SD卡中读取数据
    String readSD();

    //往SD卡中写数据
    void writeSD(String msg);
}

具体的SD卡类

package com.example.deesign_patterns.adapter.class_adapter;

//具体的SD卡类
public class SDCardImpl implements SDCard{

    @Override
    public String readSD() {
        String msg="SDCard read msg:hello world";
        return msg;
    }

    @Override
    public void writeSD(String msg) {
        System.out.println("SDCard write msg:"+msg);
    }
}

计算机类

package com.example.deesign_patterns.adapter.class_adapter;

//计算机类
public class Computer {

    //从SD卡中读取数据
    public String readSD(SDCard sdCard){
        if(sdCard==null){
            throw new NullPointerException("sd card is not null");
        }
        return sdCard.readSD();
    }
}

适配器类

package com.example.deesign_patterns.adapter.class_adapter;

//适配器类
public class SDAdapterTF extends TFCardImpl implements SDCard{

    @Override
    public String readSD() {
        System.out.println("adapter read tf card");
        return readTF();
    }

    @Override
    public void writeSD(String msg) {
        System.out.println("adapter write tf card");
        writeTF(msg);
    }
}

测试类

package com.example.deesign_patterns.adapter.class_adapter;

//测试类
public class Client {

    public static void main(String[] args) {
        //创建计算机对象
        Computer computer=new Computer();
        //读取SD卡中的数据
        String msg=computer.readSD(new SDCardImpl());
        System.out.println(msg);

        System.out.println("========================");
        //使用该电脑读取TF卡中的数据
        //定义适配器类
        String msg1=computer.readSD(new SDAdapterTF());
        System.out.println(msg1);
    }
}

在这里插入图片描述
类适配器模式违背了合成复用原则。类适配器是客户类有一个接口规范的情况下可用,反之不可用。

对象适配器模式

对上面案例进行改写,类图如下:
在这里插入图片描述

适配者类的接口

package com.example.deesign_patterns.adapter.object_adapter;

//适配者类的接口
public interface TFCard {

    //从TF卡中读取数据
    String readTF();

    //往TF卡中写数据
    void writeTF(String msg);
}

适配者类

package com.example.deesign_patterns.adapter.object_adapter;

//适配者类
public class TFCardImpl implements TFCard {

    @Override
    public String readTF() {
        String msg="TFCard read msg:hello world";
        return msg;
    }

    @Override
    public void writeTF(String msg) {
        System.out.println("TFCard write msg:"+msg);
    }
}

目标接口

package com.example.deesign_patterns.adapter.object_adapter;

//目标接口
public interface SDCard {

    //从SD卡中读取数据
    String readSD();

    //往SD卡中写数据
    void writeSD(String msg);
}

具体的SD卡类

package com.example.deesign_patterns.adapter.object_adapter;

//具体的SD卡类
public class SDCardImpl implements SDCard {

    @Override
    public String readSD() {
        String msg="SDCard read msg:hello world";
        return msg;
    }

    @Override
    public void writeSD(String msg) {
        System.out.println("SDCard write msg:"+msg);
    }
}

计算机类

package com.example.deesign_patterns.adapter.object_adapter;

//计算机类
public class Computer {

    //从SD卡中读取数据
    public String readSD(SDCard sdCard){
        if(sdCard==null){
            throw new NullPointerException("sd card is not null");
        }
        return sdCard.readSD();
    }
}

适配器类

package com.example.deesign_patterns.adapter.object_adapter;

//适配器类
public class SDAdapterTF implements SDCard {

    //声明适配者类,聚合对象
    private TFCard tfCard;

    //创建一个有参构造方法
    public SDAdapterTF(TFCard tfCard) {
        this.tfCard = tfCard;
    }

    @Override
    public String readSD() {
        System.out.println("adapter read tf card");
        return tfCard.readTF();
    }

    @Override
    public void writeSD(String msg) {
        System.out.println("adapter write tf card");
        tfCard.writeTF(msg);
    }
}

测试类

package com.example.deesign_patterns.adapter.object_adapter;

//测试类
public class Client {

    public static void main(String[] args) {
        //创建计算机对象
        Computer computer=new Computer();
        //读取SD卡中的数据
        String msg=computer.readSD(new SDCardImpl());
        System.out.println(msg);

        System.out.println("========================");
        //使用该电脑读取TF卡中的数据
        //创建适配器类对象
        SDAdapterTF sdAdapterTF = new SDAdapterTF(new TFCardImpl());
        String msg1=computer.readSD(sdAdapterTF);
        System.out.println(msg1);
    }
}

在这里插入图片描述
注意:还有一个适配器模式是接口适配器模式。当不希望实现一个接口中所有方法时,可以创建一个抽象类Adapter,实现所有方法。而此时我们只需要继承该抽象类接口。

JDK源码中Reader(字符流)、InputStream(字节流)的适配使用的是InputStreamReader。
在这里插入图片描述
结论:从表层来看,InputStreamReader做了InputStream字节流类到Reader字符流之间的转换。而从如上实现类关系结构中可以看出,是StreamDecoder的设计实现在实际上采用了适配器模式。

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

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

相关文章

力扣高频SQL50题(基础版)——第十天

力扣高频SQL50题(基础版)——第十天 1 只出现过一次的最大数字 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出1 1.1.3 示例输入输出2 1.2 示例sql语句 # 查不到时的结果自然就为Null SELECT MAX(t.num) num FROM (SELECT numFROM MyNumbersGROUP By numHAVING count…

窥探系列之Mybatis-plus BaseMapper实现

我们知道,mybatisplus的BaseMapper接口中提供了一些如updateById的方法,框架本身已经实现了这些CRUD功能,基本的CRUD我们就没必要写sql,直接使用java语法就能对数据进行操控,很方便。那么这些功能是如何被实现的呢&…

【并发知识点】AQS的实现原理及应用

系列文章目录 AQS的实现原理及应用 CAS的实现原理及应用 文章目录 系列文章目录前言一、AQS是什么?1、应用场景2、优缺点 二、案例应用1.使用AQS来实现一个简单的互斥锁2.模拟赛龙舟程序 总结 前言 在Java技术方面,AQS指的是AbstractQueuedSynchronize…

2023最新高薪岗位大爆料,大模型算法工程师!凭什么人均月薪50K

大模型算法工程师工资收入一般多少钱一个月? 最多人拿50K以上占 53.7%,2023年较2022年增长了10%。 按学历统计,本科工资¥41.9K。 按经验,1-3年工资¥40.0K。 一起来看华为招聘的大模型工程师的工资水准 岗位…

[补充]机器学习实战|第二周|第2章:监督学习|课后习题

目录 第二章 监督学习 2. 使用不同的超参数,如kernel"linear"和kernel“rbf”,尝试一个支持向量机回归器。并思考最好的SVR预测器是如何工作的? [代码]3. 为MNIST数据集构建一个分类器,并在测试集上达成超过97%的精度…

关于Java中单例模式(饿汉模式和懒汉模式)的简析

目录 一.什么是单例模式 二.饿汉模式和懒汉模式 饿汉模式 代码 懒汉模式 代码 关于多线程安全的问题 如何解决懒汉模式多线程安全问题 双if判断 一.什么是单例模式 简单来说,就是我们在程序中通过代码进行限制,在该程序中 只能创建一个对象 二.饿汉模式和懒汉模式 …

【2023,学点儿新Java-17】变量与运算符:Java中的关键字及类型划分(附: 官网) | 保留字 | 字面量 | 附:Java部分关键字介绍

前情回顾: 【2023,学点儿新Java-16】编程语言的学习方法总结 | 编程的本质和架构 | 如何深度理解编程知识和技能 | 如何成为优秀的软件开发工程师 | 附:Java初学者的困惑!【2023,学点儿新Java-15】案例分享&#xff1…

机器视觉初步7:模板匹配专题

今天端午,祝各位端午安康! 今天来说说模板匹配这个专题。 模板匹配(Template Matching)是一种图像处理技术,用于在一幅图像上查找与另一幅模板图像相同的区域。模板图像和待匹配图像的大小相同。模板匹配的目的是在待…

【MongoDB大作业】MongoDB服务器的部署

【MongoDB大作业】MongoDB服务器的部署 作业要求作业步骤一、在VMware Workstations安装Linux操作系统(最小安装即可)二、安装完成后登录系统三、将ip地址设置为固定ip地址192.168.80.134四、设置虚拟网络编辑器五、使用 CRT 工具远程连接虚拟机六、下载…

《项目实战》构建SpringCloud alibaba项目(一、构建父工程、公共库、网关))

系列文章目录 构建SpringCloud alibaba项目(一、构建父工程、公共库、网关) 构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service) 文章目录 系列文章目录1、概要2、整体架构流程2.1、技术结构组成部分…

非监督学习

聚类Clustering 查看大量数据点,自动找到彼此相关或相似的数据点 K-means算法 原理 1.随机选择点,找聚类的中心位置。将点分配给簇质心 2.移动簇质心 不断重复这两个步骤 优化目标 成本函数失真函数distortion 在每次迭代中,失真成本…

极致呈现系列之:Echarts旭日图的绚丽奇观

目录 什么是旭日图旭日图的特性及应用场景旭日图的特性应用场景 旭日图常用的配置项创建基本的旭日图自定义旭日图样式样式旭日图的高级应用 什么是旭日图 旭日图是一种可视化图表,用于展示层级结构和层级之间的关系。它以一个圆形为基础,由多层的环形图…

【从零开始学习JAVA | 第七篇】API 简介

目录 前言 API介绍: 总结: 前言 这篇章为前导性文章,主要向大家介绍了什么是API,不要求掌握,感兴趣的小伙伴们可以看一看。 API介绍: API(Application Programming Interface)是指…

webpack原理之开发第一个loader

一. 搭建项目结构 整体项目结构如图: 1. 初始化包管理器package.json npm init -y 2. 打包入口文件src/main.js 3. 单页面入口public/index.html 4. 配置webpack.config.js const path require(path) const HtmlWebpackPlugin require("html-webpack-plu…

ChatBot聊天机器人学习1

1、Bot定义 能执行大量自动化、高速或机械式、繁琐的工作的计算机程序,包括但不仅限于聊天功能 2、Retrieval-based KE(知识网络)基于信息的提取。(检索的过程中有延迟,设置比较快捷的检索方式) 2.1 Int…

一看就懂的gulp操作指南:让前端工作变得更加轻松

文章目录 I. 简介什么是gulp为什么要使用gulp安装gulp II. Gulp入门任务(task)和流(stream)的概念使用gulp来处理文件基本的gulp任务(拷贝文件、压缩文件、编译Sass等) III. Gulp进阶使用插件开发面向生产的…

基于Python+tensorflow深度学习VGG-19图像风格迁移+自动去噪(MNIST数据集)机器学习+人工智能+神经网络——含全部Python工程源码

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境TensorFlow 环境 模块实现1. 图片处理2. 模型构造 系统测试工程源代码下载其它资料下载 前言 本项目基于 MNIST 数据集,使用 VGG-19 网络模型,将图像进行风格迁移,实现去噪功…

数字信号处理课程设计——调制与解调

文字目录 数字信号处理课程设计 摘要: 1绪论 1.1通信信号的调制与解调 1.2设计题目 2卷积定理和希尔伯特公式理论推导 2.1卷积定理 ​2.2希尔伯特公式 3信号DSB调制与希尔伯特解调 3.1过程框图 3.2相关理论推导 3.2.1卷积定理在调制中的应用 3.2.2希尔…

某马 qiankun 公开课 学习记录

端午早晨阳光正好,起来学习一小下 客观评价一哈:此视频适合不了解 qiankun 的朋友入门观看,更详细的使用方法还是推荐 qiankun 官网哦,老师讲的生动活泼,值得萌新一听 某马 qiankun 公开课 - bilibili ovo很多公司的…

高通Camera Log Debug 知识点

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、Camx UMD Log Debug二、Camx KMD log Debug三、常用缩写解释四、参考文献 一、Camx UMD Log Debug 1.1 两种方式设置camx UMD Log /vendor/etc/cam…