初探设计模式:静态代理

业务场景:学生信息新增与删除

public interface StudentService {

    /**
     * 新增学生
     */
    void insertStudent();

    /**
     * 删除学生
     */
    void deleteStudent();
}
public class StudentServiceImpl implements StudentService {
    /**
     * 新增学生
     */
    @Override
    public void insertStudent() {
        System.out.println("新增学生");
    }

    /**
     * 删除学生
     */
    @Override
    public void deleteStudent() {
        System.out.println("删除学生");
    }
}

如果要针对新增或删除方法,新增日志输出或事务管理其他处理,难免要修改实现类

public class StudentServiceImpl implements StudentService {
    /**
     * 新增学生
     */
    @Override
    public void insertStudent() {
        System.out.println("方法开始执行");
        studentService.insertStudent();
        System.out.println("方法执行结束");
    }

    /**
     * 删除学生
     */
    @Override
    public void deleteStudent() {
        System.out.println("方法开始执行");
        studentService.deleteStudent();
        System.out.println("方法执行结束");
    }
}

类似这种修改方案,会导致代码越来越乱,可读性变差

面向对象编程需要对扩展开放,对修改封闭。

日志、事务等功能不属于学生管理的业务范畴,应当交给专门的类来做

public class StudentServiceProxy implements StudentService {

    private StudentService studentService;

    public StudentServiceProxy(StudentService service) {
        this.studentService = service;
    }

    /**
     * 新增学生
     */
    @Override
    public void insertStudent() {
        System.out.println("方法开始执行_静态代理");
        studentService.insertStudent();
        System.out.println("方法执行结束_静态代理");
    }

    /**
     * 删除学生
     */
    @Override
    public void deleteStudent() {
        System.out.println("方法开始执行_静态代理");
        studentService.deleteStudent();
        System.out.println("方法执行结束_静态代理");
    }
}

这样新增代理类后,我们直接调用代理类就可以像业务类一样使用它,而不影响原有代码

public class StaticProxyClient {
    public static void main(String[] args) {
        StudentService proxy = new StudentServiceProxy(new StudentServiceImpl());
        proxy.insertStudent();
        System.out.println();
        proxy.deleteStudent();
    }
}
posted @ 2021-12-30 10:56  努力的Daimon  阅读(54)  评论(0)    收藏  举报