初探设计模式:静态代理
业务场景:学生信息新增与删除
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();
}
}

浙公网安备 33010602011771号