设计模式之静态代理

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

实例

目标类的接口

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

复制代码

目标类

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

/**
 * 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动态代理ui

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

总结

静态代理设计到三个类spa

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

代理类经过实现目标类的接口,使之与目标类 类型一致。而后在代理方法中调用目标方法,并在调用先后作一些操做。设计

优势代理

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

缺点code

  • 目标类须要实现接口,目标方法须要在接口中存在
相关文章
相关标签/搜索