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

文章目录

定义

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

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

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

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

装饰模式的结构

快速入门 | Demo

顶层抽象DataSource数据源接⼝

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

具体实现类

java 复制代码
/**
 * @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编码装饰器

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

java 复制代码
/**
 * @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

java 复制代码
/**
 * @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,对文档里的字符做了解密。

我们执行:

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

java 复制代码
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());
    }
}

我们在执行以下:

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

相关推荐
胡侃有料4 小时前
【设计模式】1.简单工厂、工厂、抽象工厂模式
设计模式·抽象工厂模式
liang_jy6 小时前
观察者模式
设计模式·面试
~山有木兮7 小时前
C++设计模式 - 单例模式
c++·单例模式·设计模式
周某某~8 小时前
四.抽象工厂模式
java·设计模式·抽象工厂模式
勤奋的知更鸟9 小时前
Java编程之组合模式
java·开发语言·设计模式·组合模式
哆啦A梦的口袋呀9 小时前
基于Python学习《Head First设计模式》第九章 迭代器和组合模式
python·学习·设计模式
on the way 1239 小时前
行为型设计模式之Mediator(中介者)
java·设计模式·中介者模式
周某某~11 小时前
二.单例模式‌
java·单例模式·设计模式
十五年专注C++开发12 小时前
设计模式之单例模式(二): 心得体会
开发语言·c++·单例模式·设计模式
hstar952712 小时前
三十五、面向对象底层逻辑-Spring MVC中AbstractXlsxStreamingView的设计
java·后端·spring·设计模式·架构·mvc