我们有一个事务,要对用户实现增删改
抽象事务(UserService)
package com.huisang.demo02;
public interface UserService {
public void add();
public void delete();
public void update();
public void query();
}
抽象事务肯定需要实现
实现抽象事务的实体(UserServiceImpl)
package com.huisang.demo02;
public class UserServiceImpl implements UserService {
@Override
public void add() {
System.out.println("增加了一个用户");
}
@Override
public void delete() {
System.out.println("删除了一个用户");
}
@Override
public void update() {
System.out.println("修改了一个用户");
}
@Override
public void query() {
System.out.println("查找了一个用户");
}
}
如果我们突然要add方法添加日志功能,会修改成如下形式。
@Override
public void add() {
System.out.println("日志:add方法");
System.out.println("增加了一个用户");
}
那如果每一个方法都添加日志功能呢?先不说重复,关键是我们改变了实体的代码,
根据程序设计开闭原则,我们一般不要修改代码,而是去拓展功能。
所以代理模式就应运而生,我们不修改实现抽象事务的实体类,而是通过代理来实现这一新功能
代理事务(UserServiceProxy)
package com.huisang.demo02;
public class UserServiceProxy implements UserService{
private UserServiceImpl userService;
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
@Override
public void add() {
log("add");
userService.add();
}
@Override
public void delete() {
log("delete");
userService.delete();
}
@Override
public void update() {
log("update");
userService.update();
}
@Override
public void query() {
log("query");
userService.query();
}
//日志方法
public void log(String msg){
System.out.println("日志:"+msg+"方法");
}
}
可以看到,功能被拓展了,但是UserServiceImpl(抽象事务实体类)并没有被修改
这就是代理模式!即拓展了功能,又没有修改底层,这一点对程序员十分重要。
package com.huisang.demo02;
public class Client {
public static void main(String[] args) {
UserServiceImpl userService=new UserServiceImpl();
//添加日志功能需要对实体进行修改。
// userService.add();
//通过代理,我们不需要对实体进行修改即可完成添加日志功能的任务
UserServiceProxy proxy=new UserServiceProxy();
proxy.setUserService(userService);
proxy.add();
proxy.delete();
proxy.update();
proxy.query();
}
}