Java中的静态代理实现方式

1、编写一个接口类

如:Subject

 1 package com.neusoft.pattern.staticProxy;
 2 
 3 /**
 4  * <p>Title:</p>
 5  * <p>Description:代理接口对象</p>
 6  * <p>Copyright:Copyright (c) 2018</p>
 7  * <p>Company:东软集团股份有限公司</p>
 8  * CreateDate:2018/4/19 0019 下午 18:00
 9  * Author:段美林[duanml@neusoft.com]
10  * Version:1.0
11  */
12 public interface Subject {
13 
14     void request();
15 }

2、编写一个主体类,即需要被代理的实体类 RealSubject  必须实现接口 Subject

如:RealSubject

package com.neusoft.pattern.staticProxy;

/**
 * <p>Title:</p>
 * <p>Description:需要被代理实现的主体类</p>
 * <p>Copyright:Copyright (c) 2018</p>
 * <p>Company:东软集团股份有限公司</p>
 * CreateDate:2018/4/19 0019 下午 18:14
 * Author:段美林[duanml@neusoft.com]
 * Version:1.0
 */
public class RealSubject implements Subject {


    @Override
    public void request() {
        System.out.println("real subject execute request=========");
    }
}

3、编写一个代理类Proxy类,此类的目的是代理 RealSubject类执行相应的操作,即在 RealSubject类执行某个方法的时候,嵌入自己的其它业务逻辑

    此代理类也必须 实现接口  Subject

如:Proxy

package com.neusoft.pattern.staticProxy;

/**
 * <p>Title:</p>
 * <p>Description:代理类的实现</p>
 * <p>Copyright:Copyright (c) 2018</p>
 * <p>Company:东软集团股份有限公司</p>
 * CreateDate:2018/4/19 0019 下午 18:05
 * Author:段美林[duanml@neusoft.com]
 * Version:1.0
 */
public class Proxy implements Subject {

    private RealSubject realSubject;

    public Proxy(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void request() {

        System.out.println("代理类运行,执行:"+ "Before is invoked~~~~~~");

        try {
            realSubject.request();
        } catch (Exception e) {
            System.out.println("ex:"+ e.getMessage());
            throw e;
        } finally {
            System.out.println("代理类运行,执行:"+ "After is invoked~~~~~~");
        }
    }
}

说明:

  1、此代理Proxy类必须实现接口 Subject

  2、此代理Proxy类 必须 拥有 被代理类 RealSubject 的引用,并且通过构造方法传入 代理类中

  3、代理类Proxy类由于实现了接口 Subject,即实现了共同的方法request(),代理类在实现的request()方法中先编写实现自己的业务逻辑代码,Before的相关操作

        然后调用主体类的 RealSubject 执行 被代理类的 原有业务逻辑代码,最后 在执行完被代理类的业务方法后,执行 自己的After相关操作

  4、由此可见通过 1、2、3三步,代理类Proxy 执行了 主体被代理类的RealSubject.request()相关业务逻辑的同时,嵌入了 自己的 Before操作、After操作,而达到相应的嵌入操作

4、编写客户端访问类Client

如:Client

 1 package com.neusoft.pattern.staticProxy;
 2 
 3 /**
 4  * <p>Title:</p>
 5  * <p>Description:客户端的调用模拟类</p>
 6  * <p>Copyright:Copyright (c) 2018</p>
 7  * <p>Company:东软集团股份有限公司</p>
 8  * CreateDate:2018/4/19 0019 下午 18:14
 9  * Author:段美林[duanml@neusoft.com]
10  * Version:1.0
11  */
12 public class Client {
13 
14     public static void main(String[] args) {
15 
16         Subject subject = new Proxy(new RealSubject());
17         subject.request();
18     }
19 }

直接运行 此客户端 Main方法:

控制台输入如下结果:

即 达到了预想的效果, 在执行主体类 RealSubject.request()方法业务逻辑同时,嵌入了 Before、After相关业务操作,达到了切入的目的。

上面即为JAVA中的静态代理实现方式!

原文地址:https://www.cnblogs.com/yinfengjiujian/p/8885317.html