代理(Proxy)设计模式

代理(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();
    }
}

4.0.2 动态代理的实现 ...

猜你喜欢

转载自www.cnblogs.com/fengzhida/p/11373533.html