定义
所谓装饰器模式其实就是在原有的功能上做一个增强!!
换句话说:以前你妈妈揍你的时候用的巴掌,但是你妈妈为了增强伤害性,于是在手上拿了一根木棍,同样的力度,同样是在打你,造成的伤害不一样,木棍带来的就是增强效果!你妈妈可以在木棍和巴掌之间来回切换武器,这个木棍就是装饰器!!
比如我们以前用过一个数据访问层框架:MybatisPlus对吧?我们知道MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
而MybatisPlus只做增强不做改变!!!
装饰模式的结构
快速入门 | 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
,对文档里的字符做了解密。
我们执行:
我们现在把装饰器删掉,代码如下:
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()); } }
我们在执行以下:
我们在取消这个装饰器以后,文件内容没有被加密了,我们读取到的自然就是明文了。