代理模式是23种设计模式之一,提供了对目标对象额外的访问方式,即通过代理对象来访问目标对象,扩展业务功能,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能(满足开闭原则)。
简而言之,代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。
举一个生活中常见的例子:租房。房东就是目标对象,它需要出租自己的房屋,中介就是代理对象,它代理房东出租房屋,并且进行业务扩展(查看房源,签合同,收中介费等等)。
静态代理
这种代理方式需要代理对象个目标对象(委托者)实现一样的接口。
优点:满足开闭原则 可以在不修改目标对象的前提下,扩展目标对象的功能。
缺点:
1、冗余。代理对象和目标对象(委托者)要实现一样的接口,会产生过多的代理类 (一个目标类对应一个代理对象)
2、不易维护。一旦接口增加方法,目标对象和代理对象都需要进行修改。
- 接口类
public interface UserService {
void select();
void update();
}
- 目标对象
public class UserServiceImpl implements UserService{
@Override
public void select() {
System.out.println("查询 selectById");
}
@Override
public void update() {
System.out.println("更新 update");
}
}
- 静态代理类 同样需要实现接口,在其中进行业务扩展
public class UserServiceProxy implements UserService {
private UserService target; // 被代理的对象
public void setTarget(UserService target) {
this.target = target;
}
@Override
public void select() {
before();
target.select();
after();
}
@Override
public void update() {
before();
target.update();
after();
}
private void before(){ //执行之前
System.out.println("方法调用之前");
}
private void after(){ //执行之后
System.out.println("方法调用之后");
}
}
- 客户端
public class Client1 {
public static void main(String[] args) {
UserService userServiceImp = new UserServiceImpl();
UserServiceProxy proxy = new UserServiceProxy();
proxy.setTarget(userServiceImp);
proxy.select();
proxy.update();
}
}
- 结果
方法调用之前
查询 selectById
方法调用之后
方法调用之前
更新 update
方法调用之后