Java中的静态代理实现方式

news/2024/5/18 15:57:37

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


http://www.niftyadmin.cn/n/4557996.html

相关文章

C语言编程 用任何一种熟悉的方法描述求3个数中最小数的算法

d:c;printf("max%d/n" d c5 b6 tmp);} ||| #include<stdio.h>void main(){int a3 tmp; if (a<b) tmp a; else tmp b; if (tmp > c) tmp c; printf("%d/n" c4 b 2 直到 比完 肯定就是 最小的 被拽出来了 ||| #include <stdio.h>void …

linux---redis php扩展安装

阿里云centos6.9下 redis php扩展安装 下载phprediswget http://pecl.php.net/get/redis-3.1.0.tgz 或 wget https://github.com/nicolasff/phpredis/archive/3.1.0.tar.gz 解压安装包并进入解压后目录tar xzf redis-3.1.0.tgz cd redis-3.1.0 在当前目录下生成configure配置文…

免费的思维导图工具

知犀思维导图 https://www.zhixi.com/

ojective-C学习笔记(6)继承

在学习的上一个小程序中&#xff0c;有几个类的接口和实现都非常的相似&#xff0c;我是通过复制粘贴的方式来编写的。 可以使用继承来减少重复的代码。只有代码少了&#xff0c;bug才无处藏身。 OC是单一继承&#xff0c;可以使用OC的其他特性来达到多继承的效果&#xff0c;这…

C语言 数据结构题目一道 在线等答案~快~试写一符合上述要求的LocateNode运算的算法。

答案补充 晕还只能传一幅图 x){//从表头向后查找值为x的节点Node *p L;while(p->data ||| 就按你所说的顺序写代码不就成了 一个IF 一个排序 LocateNode(L 修改下 建议程序自己多写写 NULL) { //断开p在链表中的连接 p->prior->next p->next; p->next->pr…

thinphp5框架遇到 mkdir() Permission denied 解决办法

网站重装 直接复制本地程序文件 里面数据库链接信息要改成线上的 然后mysql apache 等都没有动 运行后出现错误 mkdir() Permission denied 这是由于runtime目录没有权限导致的 解决办法 chown -R apache runtime 这个就是把runtime目录给用户apache 要在当前目录下才行 目录…