【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)

文章目录

    • 定义
      • 装饰模式的结构
    • 快速入门 | Demo
      • 顶层抽象DataSource数据源接⼝
      • 具体实现类
      • 引入BASE**64**编码装饰器
      • 客户端Client

定义

所谓装饰器模式其实就是在原有的功能上做一个增强!!

换句话说:以前你妈妈揍你的时候用的巴掌,但是你妈妈为了增强伤害性,于是在手上拿了一根木棍,同样的力度,同样是在打你,造成的伤害不一样,木棍带来的就是增强效果!你妈妈可以在木棍和巴掌之间来回切换武器,这个木棍就是装饰器!!

比如我们以前用过一个数据访问层框架:MybatisPlus对吧?我们知道MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

而MybatisPlus只做增强不做改变!!!

image-20240705101000066

装饰模式的结构

image-20240705101043267

快速入门 | Demo

顶层抽象DataSource数据源接⼝

/**
 * @author linghu
 * @date 2024/7/4 17:34
 * 顶层抽象DataSource数据源接⼝
 */
public interface DataSource {
    void writeData(String data);
    String readData();
}

具体实现类

/**
 * @author linghu
 * @date 2024/7/4 17:38
 */
public class FileDataSource implements DataSource{
    private String name;

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

    //往文件里写入数据!
    @Override
    public void writeData(String data) {
        File file = new File(name);
        try(FileOutputStream fos = new FileOutputStream(file)) {
            fos.write(data.getBytes(),0,data.length());
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    //从文件里读数据
    @Override
    public String readData() {
        char []buffer=null;
        File file = new File(name);
        try(FileReader reader=new FileReader(file)){
            buffer=new char[(int)file.length()];
            reader.read(buffer);
        }catch (IOException e){
            System.out.println(e.getMessage());
        }
        return new String(buffer);
    }
}

引入BASE64编码装饰器

这个装饰器就是我们做的功能增强!!

/**
 * @author linghu
 * @date 2024/7/5 9:46
 */
public class EncryptionDecorator implements DataSource{
    private DataSource dataSource;

    public EncryptionDecorator(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public void writeData(String data) {
       dataSource.writeData(encode(data));
    }

    @Override
    public String readData() {
        return null;
    }
    //编码
    private String encode(String data){
        byte[] result = data.getBytes();
        //遍历result字节数组中的每个字节。然后,它通过将每个字节的值增加1来“编码”该字节。
        for (int i = 0; i < result.length; i++) {
            result[i] += (byte) 1;
        }
        return Base64.getEncoder().encodeToString(result);
    }
    //解码
    private String decode(String data) {
        byte[] result = Base64.getDecoder().decode(data);
        for (int i = 0; i < result.length; i++) {
            result[i] -= (byte) 1;
        }
        return new String(result);
    }
}

客户端Client

/**
 * @author linghu
 * @date 2024/7/5 9:38
 */
public class Client {
    public static void main(String[] args) {
        String salaryRecords = "Name,Salary / John Smith,100000 / Steven Jobs";
//        FileDataSource dataSource =
//                new FileDataSource("D:/tmp/linghu/a.txt");
        //装饰器模式
        EncryptionDecorator dataSource = new EncryptionDecorator(new FileDataSource("D:/tmp/linghu/a.txt"));
        dataSource.writeData(salaryRecords);
        //读取文件内容
        DataSource plain=new FileDataSource("D:/tmp/linghu/a.txt");
        System.out.println("--原始文件内容----");
        System.out.println(salaryRecords);
        System.out.println("--读取文件内容---");
        System.out.println(plain.readData());
    }
}

在这段代码里:

EncryptionDecorator dataSource = new EncryptionDecorator(new FileDataSource("D:/tmp/linghu/a.txt"));

其实就是加了一个装饰器 EncryptionDecorator,对文档里的字符做了解密。

我们执行:

image-20240705103203584

我们现在把装饰器删掉,代码如下:

public class Client {
    public static void main(String[] args) {
        String salaryRecords = "Name,Salary / John Smith,100000 / Steven Jobs";
        FileDataSource dataSource =
                new FileDataSource("D:/tmp/linghu/a.txt");
        //装饰器模式
//        EncryptionDecorator dataSource = new EncryptionDecorator(new FileDataSource("D:/tmp/linghu/a.txt"));
        dataSource.writeData(salaryRecords);
        //读取文件内容
        DataSource plain=new FileDataSource("D:/tmp/linghu/a.txt");
        System.out.println("--原始文件内容----");
        System.out.println(salaryRecords);
        System.out.println("--读取文件内容---");
        System.out.println(plain.readData());
    }
}

我们在执行以下:

image-20240705103405470

我们在取消这个装饰器以后,文件内容没有被加密了,我们读取到的自然就是明文了。

image-20240705103547910

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

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

相关文章

Windows 安装hadoop 3.4

目录 安装 下载 设置环境变量 配置 修改&#xff1a;hadoop-env.cmd 修改&#xff1a;core-sit.xml 修改&#xff1a;hdfs-site.xml 修改&#xff1a;mapred-site.xml 修改&#xff1a;yarn-site.xml 运行 格式化HDFS文件系统 启动&#xff1a;hadoop 启动&#xf…

开源大模型和闭源大模型,打法有何区别?

现阶段&#xff0c;各个公司都有自己的大模型产品&#xff0c;有的甚至不止一个。除了小部分开源外&#xff0c;大部分都选择了闭源。那么&#xff0c;头部开源模型厂商选择开源是出于怎样的初衷和考虑&#xff1f;未来大模型将如何发展&#xff1f;我们来看看本文的分享。 在对…

多态的优点

多态的优点 1、多态的优点1.1 可替换性&#xff08;Substitutability&#xff09;2、可扩充性&#xff08;Extensibility&#xff09; 2、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、多态的优点 在面向对象编程&#xff08;OOP…

滤波算法学习笔记

目录 引言 一、定义 二、分类 三、常见滤波算法 四、应用与优势 五、发展趋势 例程 1. 均值滤波&#xff08;Moving Average Filter&#xff09; 2. 中值滤波&#xff08;Median Filter&#xff09; 3. 高斯滤波&#xff08;Gaussian Filter&#xff09; 4.指数移动…

【Python画图-seaborn驯化】一文学会seaborn画散点图scatterplot、swarmplot技巧

【Python画图-seaborn驯化】一文学会seaborn画散点图scatterplot、swarmplot 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内…

【uni-app】基础

一、官网 网址&#xff1a;https://zh.uniapp.dcloud.io/tutorial/其他辅助网页讲解&#xff1a;https://www.wenjiangs.com/doc/7y94pldun2插件下载free&#xff1a;https://ext.dcloud.net.cn/ 二、提示框 用uni.showToast提醒的次数超过7个字的时候就会导致文字显示不全&…

【Arduino】XIAOFEIYU实验ESP32使用温湿度传感器测量温度(图文)

温度传感器在我们的日常生活中应用还是很普遍的&#xff0c;使用ESP32可以方便的使用温度传感器对文档进行测量&#xff0c;今天XIAOFEIYU就来实验一下DHT11温湿度传感器。 需要安装DHT温度传感器的库&#xff0c;可以先进行下载&#xff1a;GitHub - adidax/dht11: DHT11 lib…

ChatMoney:AI看病,私人医生不是梦想!

本文由 ChatMoney团队出品 在当今这个科技飞速发展的时代&#xff0c;人工智能技术正在以惊人的速度改变着我们的生活&#xff0c;人工智能已经深入到各个领域&#xff0c;医疗行业也不例外。 而今天我要和大家聊一聊利用ChatMoney全能知识库AI系统在求医问诊领域所发挥的巨大…

Cesium与Three相机同步(3)

Cesium与Three融合的案例demo <!DOCTYPE html> <html lang"en" class"dark"><head><meta charset"UTF-8"><link rel"icon" href"/favicon.ico"><meta name"viewport" content&q…

接口签名、日志、token校验优化

文章目录 引言I 整合接口签名校验、接口信息日志处理、token校验功能为一个注解1.1 获取注解信息,判断API校验功能配置II 签名优化2.1 签名随机数统一放在请求头2.2 校验签名接口的请求参数类型为自定义对象2.3 获取请求数据,并校验签名数据2.4 Knife4j全局添加鉴权参数III 签…

thinkadmin 新增和编辑页面多选关联表人员信息,并可按名称搜索查询

假如现在有一个窗口表和人员表,窗口表中的user_ids字段存储多个工作人员,人员表的id在窗口表的user_ids字段中存储为 “1,2,3”,代表3个工作人员,通过以下代码实现 form.html <div class="layui-col-xs12"><span class="help-label

自动驾驶理论新突破登Nature子刊!清华、密歇根联合提出三条技术路线,剑指「稀疏度灾难」

自动驾驶理论新突破登Nature子刊&#xff01;清华、密歇根联合提出三条技术路线&#xff0c;剑指「稀疏度灾难」 近日&#xff0c;清华大学与密歇根大学联合提出的自动驾驶汽车安全性「稀疏度灾难」问题&#xff0c;发表在了顶刊《Nature Communications》上。研究指出&#…

【12321骚扰电话举报受理中心-短信验证安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

揭秘:华火电焰灶可不可信,安不安全?

随着科技的不断进步&#xff0c;传统厨房灶具也在经历着前所未有的变革。在这个追求环保、节能和智能化的时代&#xff0c;最近发布的一款名为华火电燃喷焰式组合灶厨吸引了众多消费者的目光。今天&#xff0c;我们就来对这款华火HH-SZQP60电燃喷焰式组合灶进行一次深入评测&am…

谷粒商城学习-06-使用vagrant快速创建linux虚拟机

这一节的内容是在Windows上安装虚拟机。 为什么要按照虚拟机呢&#xff1f; 原因是很多软件只能在Linux下运行&#xff0c;有的虽然也可以在Windows上运行&#xff0c;但从安装到运行会遇到很多问题&#xff0c;为这些解决这些问题花时间对于大多数人特别是初学者是没有什么价…

Qt中udp指令,大小端,帧头帧尾实际示例

前言 虽然QT中&#xff0c;udp发送和接收&#xff0c;其实非常简单&#xff0c;但是实际工作中&#xff0c;其实涉及到帧头帧尾&#xff0c;字节对齐&#xff0c;以及大小端序的问题。比如网络中&#xff0c;正规的一般都是大端序&#xff0c;而不是小端序&#xff0c;大多数的…

Arthas实战(3)- CPU使用率高问题排查

一、 准备测试应用 新建一个 SpringBoot应用&#xff0c;写一段 CPU 使用率高的代码&#xff1a; GetMapping("/cpuUsageRate") public String cpuUsageRate() {while (true) {// 这个循环没有实际意义&#xff0c;只是为了占用CPUfor (int i 0; i < 1_000_000…

(三)共享模型之管程

线程安全问题 案例 两个线程对初始值为 0 的静态变量一个做自增&#xff0c;一个做自减&#xff0c;各做 5000 次&#xff0c;结果是 0 吗&#xff1f; Slf4j(topic "c.ThreadSafe") public class ThreadSafe {public static int counter 0;public static void …

南京,协同开展“人工智能+”行动

南京&#xff0c;作为江苏省的省会城市&#xff0c;一直以来都是科技创新和产业发展的高地。近日&#xff0c;南京市政府正式印发了《南京市进一步促进人工智能创新发展行动计划&#xff08;2024—2026 年&#xff09;》和《南京市促进人工智能创新发展若干政策措施》的“11”文…

Linux Static Keys和jump label机制

文章目录 前言一、asm goto二、API使用2.1 低版本API2.2 高版本API 三、jump label四、源码分析4.1 数据结构4.2 static_key_false4.3 jump_label_init4.4 __jump_label_transform4.5 static_key_slow_inc/dec 五、__jump_table节5.1 内核5.2 内核模块 六、修改内存代码6.1 x86…