静态代理

代理模式是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
方法调用之后
posted @ 2021-01-14 21:42  刘指导  阅读(125)  评论(0编辑  收藏  举报