1. 静态代理
1.想理解什么是静态代理,首先要知道什么是代理模式?
下面是一个简单的例子
客户:只想租房子
房东:只想出租房子,不想张贴广告宣传
这样就衍生出了一个行业:中介,中介可以代理房东出租房子,然后还可以打广告,收取中介费等一系列操作,
而客户只是多出了一点钱,原来是找房东租房子,现在是找中介租房子,对于客户来说,基本没有什么改变,
但背后确实有了一些改变,只是客户感觉不到。
2.静态代理的优缺点
优点:在不修改目标对象的前提下,能通过代理对象对目标功能扩展
缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多的代理类
一旦接口增加方法,目标对象与代理对象都要维护
3.下面通过一个简单的例子模拟一下静态代理的过程
客户类
public class Client {
public static void main(String[] args){
UserServiceImpl userService = new UserServiceImpl();
// 代理模式
UserServiceImplProxy proxy = new UserServiceImplProxy();
proxy.setUserService(userService);
proxy.add();
}
}
接口类
public interface UserService {
void add();
void delete();
void update();
void select();
}
实现类
// 真实对象
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 select() {
System.out.println("查询了一个用户");
}
// 改动源代码,在公司中是大忌,因为很有可能使以前的代码跑不起来。
}
问题来了,怎么在不修改源代码的基础上,实现日志功能的添加呢?
所以我们就需要使用代理对象了。
public class UserServiceImplProxy implements UserService{
private UserServiceImpl userService;
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
@Override
public void add() {
log();
userService.add();
}
@Override
public void delete() {
log();
userService.delete();
}
@Override
public void update() {
log();
userService.update();
}
@Override
public void select() {
log();
userService.select();
}
// 日志方法
public void log(){
System.out.println("[Debug] 日志功能实现");
}
}