设计模式 结构型模式 -- 代理模式模式实例:日志文件

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 结构型模式 -- 代理模式模式实例:日志文件相关的知识,希望对你有一定的参考价值。

1. 代理模式模式实例


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


以上是关于设计模式 结构型模式 -- 代理模式模式实例:日志文件的主要内容,如果未能解决你的问题,请参考以下文章

结构型模式-代理模式

设计模式结构型(代理模式桥接模式装饰者模式适配器模式)

揭秘设计模式之代理模式

代理模式-1(静态代理)

代理模式-1(静态代理)

③结构型设计模式代理模式