设计模式之静态代理

164 阅读1分钟

先看代码,认识以下什么是静态代理

实例

目标类的接口

/**
 * UserService 是 目标类的接口
 * login() 就是要被代理的方法
 */
public interface UserService {
    boolean login(String userName, String password);
}

目标类

注意,要代理的方法,必须从接口中实现

/**
 * UserServiceImpl 是目标类,或者叫被代理的类
 * login() 就是要被代理的方法
 */
public class UserServiceImpl implements UserService {

    @Override
    public boolean login(String userName, String password) {
        System.out.println("校验账号");
        return false;
    }
}

代理类

注意,要代理的方法,必须从接口中实现

/**
 * UserServiceProxy 是代理类,它继承了 UserService 接口,实现了login()方法
 */
public class UserServiceProxy implements UserService {

    /**
     * 其实就是写一个新方法把 目标方法包起来
     */
    @Override
    public boolean login(String userName, String password) {
        before();
        UserService userServiceImpl = new UserServiceImpl();
        Object result = userServiceImpl.login(userName, password);
        after();
        return result;
    }

    private void before() {
        System.out.println("调用目标方法之前输出的log");
    }

    private void after() {
        System.out.println("调用目标方法之后输出的log");
    }
}

测试类

上面三个类构成了jdk动态代理的最小组成单位,接下来,编写测试类使用jdk动态代理

public static void main(String[] args) {
    // 创建代理对象
    UserService userServiceProxy = new UserServiceProxy();
    // 调用代理方法
    userServiceProxy.login("wqlm", "123");
}

总结

静态代理设计到三个类

  • 目标类的接口 Interface
  • 目标类 target
  • 代理类 Proxy

代理类通过实现目标类的接口,使之与目标类 类型一致。然后在代理方法中调用目标方法,并在调用前后做一些操作。

优点

  • 在不更改目标方法的基础上,对目标方法做增强,降低了系统的耦合度。
  • 代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用

缺点

  • 目标类需要实现接口,目标方法需要在接口中存在