设计模式-结构型

代理模式

静态代理:代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public interface Company {
void findWorker();
}

public class Hr implements Company {
@Override
public void findWorker() {
System.out.println("我需要找招聘一个员工");
}
}

public class Proxy implements Company {
private Hr hr;

public Proxy(){
this.hr = new Hr();
}

@Override
public void findWorker() {
hr.findWorker();
System.out.println("找到了员工");
}

}
public class test {
public static void main(String[] args) {
Company company=new Proxy();
company.findWorker();
}
}

动态代理:动态代理在程序运行时才创建具体的代理类,代理类和被代理类的关系在运行前是不确定的。动态代理的适用性更强,主要分为 JDK 动态代理和 CGLib 动态代理。

JDK 动态代理:通过 Proxy类的 newInstance 方法获取一个动态代理对象,需要传入三个参数,被代理对象的类加载器、被代理对象实现的接口,以及一个 InvocationHandler 调用处理器实例来指明具体的逻辑,相比静态代理最大的优势是接口中声明的所有方法都被转移到 InvocationHandler 中的 invoke 方法集中处理

1
2
3
4
5
6
7
8
9
10
11
12
13
public class test {

public static void main(String[] args) {
Hr hr = new Hr();
Company proxyHr = (Company) Proxy.newProxyInstance(hr.getClass().getClassLoader(), hr.getClass().getInterfaces(), (proxy, method, args1) -> {
System.out.println("接收代理请求");
Object obj = method.invoke(hr, args1);
System.out.println("找到了员工,完成请求");
return obj;
});
proxyHr.findWorker();
}
}