代理(Proxy)设计模式
1.0.0 代理模式产生的背景
- 系统都具有核心,核心代码是实现功能的basic。
- 在一些情况下,为了满足业务的需求,我们需要对原有的核心进行加强 after() before()等前置后置甚至是环绕的方法。
1.0.1 对原有类进行加强的方式
- 一种解决方式是通过继承,override,加强或者变换核心的实现。
- 通过代理的模式,对要修改的核心进行修改或者变换已达到对对象加强的操作。
1.0.2 为什么要是用代理类来进行加强?
- 继承会暴露父类的接口或者函数
- 代理可以封装多个不同的对象,完整的解决对象。
- 代理可以选用参数的方法来实现功能,不会暴露父类的任何接口或者函数,封装性比较好。这是在语言上说的,当然,通过反射等不同的操作途径,都可以读取类的函数。
2.0.0 代理模式的定义
代理模式通过给对象A创建一个代理对象B,B中含有A的引用,进而控制A行为的模式。
现实中的例子:A因为劳动问题将B上诉至法庭,A不太懂法律,需要C去帮A进行代理,以便达到最好的效果。
```java
Class A{
public void 准备材料(){}
public void 吃饭(){}
public void 睡觉(){}
}
Class C{
private A a;
public C(A a){this.a=a;}
public void 上诉(){获取材料();寻找法律依据();诉讼完成();}
private void 获取材料(){a.准备材料();}
private void 寻找法律依据(){}
private void 诉讼完成(){}
}
//C是A的代理类,我们通过C访问不到A的任何接口或者函数。
```
3.0.0 代理模式的分类
按照代理创建的时间:
- 静态代理模式--->编译期间就已经创建好的
- 动态代理模式--->运行期间创建好的
3.0.1 什么是编译期?什么是运行期?...
4.0.0 代理模式的实现
4.0.1 静态代理的实现
@Slf4j
public class Proxy {
class Worker {
public void eat() {log.info("{}", "eat");}
public void sleep() {log.info("{}", "sleep");}
public void work() {log.info("{}", "work");}
}
class WorkerProxy {
private Worker worker;
public WorkerProxy(Worker worker) {this.worker = worker;}
public void work() {
before();
worker.work();
after();
}
private void before() {log.info("{}", "before");}
private void after() {log.info("{}", "after");}
}
public static void main(String[] args) {
Proxy proxy = new Proxy();
Worker worker = proxy.new Worker();
WorkerProxy workerProxy = proxy.new WorkerProxy(worker);
workerProxy.work();
}
}