设计模式轻松学【六】静态代理

简介: 学习动态代理之前,我们先了解了解静态代理

静态代理通常用于对原有业务逻辑的扩充。比如你有一个已实现的功能类,并且调用了其中的某些方法。由于需求变更,你需要加入日志打印,但又不合适将逻辑 直接加入其中。所以可以创建一个代理类来实现。

实现步骤:

  • 创建代理类,实现和待扩展功能类一样的方法。
  • 通过代理类持有真实对象
  • 然后在源代码中调用代理类方法,来添加我们新加入的业务逻辑
  • 一个典型的代理模式通常有三个角色:

    • Subject:抽象主题角色,抽象主题类可以是抽象类,也可以是接口,是一个最普通的业务类型定义,无特殊要求。
    • RealSubject:具体主题角色,也叫被委托角色、被代理角色。是业务逻辑的具体执行者。
    • Proxy:代理主题角色,也叫委托类、代理类。它把所有抽象主题类定义的方法给具体主题角色实现,并且在具体主题角色处理完毕前后做预处理和善后工作。

共同接口

public interface Action {
    public void doSomething();
}

真实对象

public class RealObject implements Action{
 
    public void doSomething() {
        System.out.println("do something");
    }
}

代理对象

public class Proxy implements Action {
    private Action realObject;
 
    public Proxy(Action realObject) {
        this.realObject = realObject;
    }
    public void doSomething() {
        System.out.println("proxy do");
        realObject.doSomething();
    }
}

运行代码

    Proxy proxy = new Proxy(new RealObject());
    proxy.doSomething();

实现原理

image.png

优缺点

优点:不破坏原代码,不影响原来老的功能

缺点:如果有10个这样的功能类RealObject,而且我们要去代理的方法是不同的,比如代理:doSomething、doAnotherThing、doTwoAnotherThing等方法

realObject.doSomething();
realObject1.doAnotherThing();
realObject2.doTwoAnother();

缺点解决方案

  1. 为这些方法创建不同的代理类,使用不同的代理对象独自完成,代理后的代码如下

    //不同的代理对象,独自完成
    proxy.doSomething();
    proxy1.doAnotherThing();
    proxy2.doTwoAnother();
  2. 创建一个综合型的Proxy,实现Action1、Action2、Action3.....,并且持有不同的realObject实例,由一个proxy代理对象来调用其他方法,但这样会显得非常膨胀,非常臃肿

    //同一个代理对象,持有不同的realObject实例
    proxy.doSomething();
    proxy.doAnotherThing();
    proxy.doTwoAnother();

    你的类结构就变成了如下样子

    image.png

这种综合型的操作,非常难以维护,若出现方法名相同,仅参数不同的对象,调用的时候需要额外判断,否则容易出错

相关文章
|
2天前
|
设计模式 XML JSON
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
|
8月前
|
设计模式 缓存 安全
设计模式之代理模式的懂静态代理和动态代理
设计模式之代理模式的懂静态代理和动态代理
65 0
|
2天前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
|
2天前
|
设计模式 安全 Java
静态代理还是动态代理?来聊聊Java中的代理设计模式
代理模式(Proxy Design Pattern)是一种结构型设计模式,为一个对象提供一个代理对象,然后使用代理对象控制对原对象的引用。即通过代理对象访问目标对象。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。
34 0
静态代理还是动态代理?来聊聊Java中的代理设计模式
|
2天前
|
设计模式
装饰者设计模式(二)番外篇 装饰者设计模式和静态代理设计模式区别
装饰者设计模式(二)番外篇 装饰者设计模式和静态代理设计模式区别
|
10月前
|
设计模式 缓存 Java
代理设计模式解读(下)
代理设计模式解读(下)
|
6月前
|
设计模式 Java
设计模式之代理模式(静态&动态)代理
二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来——解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。
26 0
|
9月前
|
设计模式 缓存 Java
Java反射(反射与代理设计模式、反射与Annotation、自定义Annotation、反射整合工厂设计模式和代理设计模式)
1.反射与代理设计模式,2.反射与Annotation,3.自定义Annotation,4.Annotation整合工厂设计模式和代理设计模式
45 0
|
10月前
|
设计模式 安全 Java
|
11月前
|
设计模式 Java Spring
Java代理设计模式
Java代理设计模式是非常常用的设计模式,像spring中就使用了很多的代理模式 使用代理我们可以对一个类进行增强或者缩减功能;代理可以分为静态代理和动态代理 静态代理:代理对象在编译期,就已经被编译成class,在运行之前就已经存在了 动态代理:代理对象是在运行期间通过反射生成的
51 0