设计模式 结构型模式 -- 代理模式模式实例:日志文件
Posted CodeJiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 结构型模式 -- 代理模式模式实例:日志文件相关的知识,希望对你有一定的参考价值。
1. 代理模式模式实例
- 01:设计模式 结构型模式 – 代理模式(代理模式概述、结构、静态代理、动态代理)
- 02: 设计模式 结构型模式 – 代理模式(动态代理(JDK动态代理(JDK动态代理要求必须定义接口,对接口进行代理。)、动态代理原理(使用arthas-boot.jar查看代理类的结构)、动态代理的作用)
- 03: 设计模式 结构型模式 – 代理模式(动态代理(CGLIB动态代理)、三种代理的对比(静态代理、动态代理(JDK代理和CGLIB代理)、优缺点、使用场景))
1.1 需求
某文件系统中,对文件的所有操作都按一定格式记录在日志文件中如(要求传入文件操作地址):
2009.12.12 12:22:22 修改文件 d:/xx.doc
2009.12.12 12:22:22 删除文件 d:/xx.doc
请用代理模式实现此功能
1.2 代码实现
我这里的日志文件和测试文件刚开始都是空文件。
1.2.1 抽象主题角色 OperateFile.java
OperateFile.java
package proxy;
import java.io.File;
/**
* ClassName: OperateFile
* Description: 抽象主题角色
*
* @author Tianjiao
* @date 2021/11/1 23:21
*/
public interface OperateFile
// 读文件
void readFile(File file) throws Exception;
// 更新文件
void updateFile(File file, String content) throws Exception;
// 删除文件
void deleteFile(File file) throws Exception;
1.2.2 真实主题角色 FileSystem.java
FileSystem.java
package proxy;
import java.io.*;
/**
* ClassName: FileSystem
* Description: 真实主题角色
*
* @author Tianjiao
* @date 2021/11/2 0:00
*/
public class FileSystem implements OperateFile
@Override
public void readFile(File file) throws Exception
if (!file.exists())
file.createNewFile();
// 用于存储读取的字符串
StringBuilder stringBuilder = new StringBuilder();
FileReader fileReader = new FileReader(file.getAbsoluteFile());
BufferedReader bufferedReader = new BufferedReader(fileReader);
String s;
while ((s = bufferedReader.readLine()) != null)
stringBuilder.append(System.lineSeparator()).append(s);
bufferedReader.close();
fileReader.close();
System.out.println(stringBuilder.toString());
@Override
public void updateFile(File file, String content) throws Exception
if (!file.exists())
file.createNewFile();
FileWriter fileWriter = new FileWriter(file.getAbsoluteFile(), true);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write(content + "\\n");
bufferedWriter.close();
fileWriter.close();
@Override
public void deleteFile(File file)
file.delete();
1.2.3 代理类 ProxyFactory.java
ProxyFactory.java
package proxy;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* ClassName: ProxyFactory
* Description:代理类:也实现了被代理对象的接口
*
* @author Tianjiao
* @date 2021/11/2 0:09
*/
public class FileSystemProxy implements OperateFile
//声明目标对象
private final FileSystem fileSystem = new FileSystem();
// 定义格式
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
@Override
public void readFile(File file) throws Exception
fileSystem.readFile(file);
writeLog("read", file);
@Override
public void updateFile(File file, String content) throws Exception
fileSystem.updateFile(file, content);
writeLog("update", file);
@Override
public void deleteFile(File file) throws Exception
fileSystem.deleteFile(file);
writeLog("delete", file);
public void writeLog(String operate, File file) throws IOException
File logFile = new File("E:\\\\IDEACode\\\\my-springboot\\\\demo\\\\resources\\\\log_file.txt");
String currentOperate = "";
FileWriter fileWriter = new FileWriter(logFile.getAbsoluteFile(), true);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
switch (operate)
case "read":
currentOperate = "读取文件";
break;
case "update":
currentOperate = "修改文件";
break;
case "delete":
currentOperate = "删除文件";
break;
bufferedWriter.write(dateFormat.format(new Date()) + " " + currentOperate + " " + file.getAbsolutePath() + "\\n");// 格式化时间);
bufferedWriter.close();
fileWriter.close();
1.2.3 测试类 Client.java
Client.java
package proxy;
import java.io.File;
/**
* ClassName: Client
* Description:
*
* @author Tianjiao
* @date 2021/11/2 0:14
*/
public class Client
public static void main(String[] args) throws Exception
File file = new File("E:\\\\IDEACode\\\\my-springboot\\\\demo\\\\resources\\\\test_file.txt");
FileSystemProxy fileSystemProxy = new FileSystemProxy();
// 往测试文件里面写入 Hello World!
fileSystemProxy.updateFile(file, "Hello World!");
Thread.sleep(2000); // 线程休眠是为了让日志文件的记录更有条理
// 读取文件内容
fileSystemProxy.readFile(file);
Thread.sleep(2000);
// 往测试文件里面写入 I Love Coding!
fileSystemProxy.updateFile(file, "I Love Coding!");
Thread.sleep(2000);
// 读取文件内容
fileSystemProxy.readFile(file);
Thread.sleep(2000);
// 删除该文件
fileSystemProxy.deleteFile(file);
1.3 运行结果
log_file.txt:
2021.12.06 11:16:26 修改文件 E:\\IDEACode\\my-springboot\\demo\\resources\\test_file.txt
2021.12.06 11:16:28 读取文件 E:\\IDEACode\\my-springboot\\demo\\resources\\test_file.txt
2021.12.06 11:16:30 修改文件 E:\\IDEACode\\my-springboot\\demo\\resources\\test_file.txt
2021.12.06 11:16:32 读取文件 E:\\IDEACode\\my-springboot\\demo\\resources\\test_file.txt
2021.12.06 11:16:34 删除文件 E:\\IDEACode\\my-springboot\\demo\\resources\\test_file.txt
以上是关于设计模式 结构型模式 -- 代理模式模式实例:日志文件的主要内容,如果未能解决你的问题,请参考以下文章