设计模式之代理模式(十一)

news2024/11/18 11:23:58

目录

1. 静态代理

2. 动态代理

 3. Cglib代理


代理模式:为一个对象提供一个替身,以控制对这个对象的访问。好处就是可以用来增强。

被代理的对象可以是 远程对象创建开销大的对象 或者 需要安全控制的对象。

可以分为三类

  • 静态代理
  • 动态代理(JDK代理,接口代理)
  • Cglib代理(属于动态代理,在内存动态的创建对象,而不需要实现接口)

示意图

 

1. 静态代理

目标对象与代理对象都要实现同一个接口或者继承相同父类。

代码实现:

public interface ITeacherDao {
    String teach();
}


public class TeacherDao implements ITeacherDao{
    private String name;
    public TeacherDao(String name) {
        this.name = name;
    }
    @Override
    public String teach() {
        System.out.println(name + "老师正在讲课。。。");
        return name;
    }
}


public class TeacherDaoProxy implements ITeacherDao{

    private ITeacherDao teacherDao;

    public TeacherDaoProxy(ITeacherDao teacherDao) {
        this.teacherDao = teacherDao;
    }

    @Override
    public String teach() {
        System.out.println("开始静态代理。。。,可以进行增强");
        String name = teacherDao.teach();
        System.out.println("结束静态代理。。。");
        return name;
    }
}

Client:

public class Client {
    public static void main(String[] args) {
        ITeacherDao target = new TeacherDao("ksj");

        TeacherDaoProxy proxy = new TeacherDaoProxy(target);

        String teach = proxy.teach();
        System.out.println(teach);
    }
}

 

2. 动态代理

 

静态代理缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类 ,一旦接口增加方法,目标对象与代理对象都要维护。

这就要用到动态代理了,动态的在内存中构建代理对象,只需要目标对象实现接口。利用JDK的Api来实现。

java.lang.reflect.Proxy里面的
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
  • ClassLoader loader:目标对象的类加载器。
  • Class<?>[] interfaces: 目标对象实现的接口数组。
  • InvocationHandler h:事件处理器,里面利用反射调用方法。

接口和目标类与上面静态代理相同,下面直接写代理工厂类

public class ProxyFactory {

    private final Object target;

    public ProxyFactory(Object target){
        this.target = target;
    }

    public Object getProxyInstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("JDK代理开始");
                Object returnVal = method.invoke(target, args);
                System.out.println("JDK代理结束");
                return returnVal;
            }
        });
    }
}
public class Client {
    public static void main(String[] args) {
        ITeacherDao target = new TeacherDao("ksj");
        System.out.println("target=" + target.getClass());
        ProxyFactory proxyFactory = new ProxyFactory(target);
        ITeacherDao proxyInstance = (ITeacherDao) proxyFactory.getProxyInstance();
        // proxyInstance=class com.sun.proxy.$Proxy0 内存中动态生成了代理对象
        System.out.println("proxyInstance=" + proxyInstance.getClass());
        String name = proxyInstance.teach();
        System.out.println(name);
    }
}

 3. Cglib代理

Cglib 代理也叫作子类代理,属于动态代理。相比较静态代理和JDK代理,Cglib代理不需要实现接口。Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接 口. 它广泛的被许多 AOP 的框架使用 , 例如 Spring AOP ,实现方法拦截。 
  • 目标对象需要实现接口,用JDK代理
  • 目标对象不需要实现接口,用Cglib代理
简单来说就是实现MethodIterceptor接口,实现 intercept接口来实现代理。

代码实现:

 

public class TeacherDao {
	public String teach() {
		System.out.println(" 老师授课中  , 我是cglib代理,不需要实现接口 ");
		return "hello";
	}
}


public class ProxyFactory implements MethodInterceptor {
	//维护一个目标对象
	private Object target;
	//构造器,传入一个被代理的对象
	public ProxyFactory(Object target) {
		this.target = target;
	}

	//返回一个代理对象:  是 target 对象的代理对象
	public Object getProxyInstance() {
		//1. 创建一个工具类
		Enhancer enhancer = new Enhancer();
		//2. 设置父类
		enhancer.setSuperclass(target.getClass());
		//3. 设置回调函数
		enhancer.setCallback(this);
		//4. 创建子类对象,即代理对象
		return enhancer.create();
		
	}

	//重写  intercept 方法,会调用目标对象的方法
	@Override
	public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
		System.out.println("Cglib代理模式 ~~ 开始");
		Object returnVal = method.invoke(target, args);
		System.out.println("Cglib代理模式 ~~ 提交");
		return returnVal;
	}
}


public class Client {

	public static void main(String[] args) {
		//创建目标对象
		TeacherDao target = new TeacherDao();
		//获取到代理对象,并且将目标对象传递给代理对象
		TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(target).getProxyInstance();
		//执行代理对象的方法,触发intecept 方法,从而实现 对目标对象的调用
		String res = proxyInstance.teach();
		System.out.println("res=" + res);
	}
}

还有其他代理变体:

  • 防火墙代理
  • 缓存代理
  • 远程代理
  • 同步代理等 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Robot Framework 自动化测试详解

一、Robot Framework 简介 1、界面自动化测试工具 界面自动化测试,即UI自动化测试,比较常见的工具有:QTP、AutoIt、Selenium等。 像QTP经历了很多版本,最新的版本好像叫UFT了。对初学者来说,录制回放是相当容易上手的,除了录制,QTP主要用VBScript脚本编写代码,同时有…

C/C++语言 9 —— 函数

把相同业务功能维度的代码有机的整合起来做成函数&#xff0c;这样做既可以方便反复调用&#xff0c;又可以在空间上节省代码行数。 函数的定义&#xff1a; 返回值类型 函数名(参数类型1 参数变量名1, ....参数类型N 参数变量N){ //此处参数为形参// 函数体.... } 如果不需…

外汇天眼:德国PPI利淡欧美镑美跌逾百点,美元涨近百点,黄金跌约20美元,关注美制造业指数

昨日重要因素影响 : 1.英媒&#xff1a;英国在继续购买俄罗斯石油 但称从其他国家进口 2.德国10月PPI月率低于市场预期 3.欧洲央行首席经济学家连恩&#xff1a;我们将在12月再次加息&#xff0c;不认为12月将是最后一次加息 4.穆迪&#xff1a;在需求降温的环境下&#xf…

Java标准输入输出流【转换流打印流】

➤ Java 输入输出IO流 全部导航 文章目录乱码转换【转换流】InputStreamReaderOutputStreamWriter打印流&#xff1a;PrintStreamPrintWriter类型默认设备System.in 标准输入InputStream键盘System.out 标准输出PrintStream显示器 System类的 public final static InputStream…

C++ 语法基础课4 —— 数组

文章目录1. 一维数组1.1 数组的定义1.2 数组的初始化1.3 访问数组元素(通过下标访问数组)1.4 练习1:1.5 练习21.6 练习31.7 练习41.8 练习4(难点)2. 多维数组2.1 练习11. 一维数组 1.1 数组的定义 数组的定义方式和变量类似 #include<iostream> #include<algorithm…

linux网络编程 - epoll边沿触发/水平触发内核实现代码分析

1、listen socket水平触发的poll函数调用 以服务器端epoll为例&#xff0c;加入监听、等待并接受连接、再次等待&#xff0c;会有3次检查是否有连接就绪的操作&#xff0c;分别是epoll_ctl、epoll_wait、epoll_wait。 1.1、epoll_wait(第1次调用) 等待就绪链表相关内核看前面发…

dropout 机制存在,对于同一句子的两次输出是不同的

SimCSE 提供了无监督&#xff08;上图 a&#xff09;和有监督&#xff08;上图 b&#xff09;两种架构&#xff0c;由于业务需要我们只用了无监督方式&#xff0c;其基本思路是&#xff1a; 1. 同一个 batch 内的数据两次输入模型。 2. 由于有 dropout 机制存在&#xff0c;对…

摩托车商城系统(基于javaweb开发的项目)

目录 前言 一、项目目录 二、效果图 2.1 首页面效果图 2.2 商品分类页面 ​​​​​​​2.3 热销栏页面 2.4 新品栏页面 2.5 购物狂欢栏页面 2.6 我的订单页面 2.7 个人中心页面 2.8 注册页面 2.9 用户登录页面 2.10 Admin后台管理主页面 2.11 Admin订单管理页面 2.12 A…

[附源码]SSM计算机毕业设计基于社区生鲜配送系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

万字总结线程池

本文将从背景、原理、架构、实现、参数状态等方面详细介绍percona-线程池。此外&#xff0c;还将简单介绍腾讯云企业级MySQL(CDB)内核技术--TXSQL&#xff0c;关于线程池的动态启停、负载均衡以及快速断连等优化。 「第一部分 背景」 社区版的MySQL的连接处理方法默认是为每个…

“信任机制”才是数字化时代发展中的精髓所在

2008年&#xff0c;美国次贷危机全面爆发并不断蔓延&#xff0c;最终席卷全球&#xff0c;酿成了世界性的金融危机。当年11月1日&#xff0c;一位署名为中本聪的人发表一篇《比特币&#xff1a;一种点对点的电子现金系统》论文提出了一种完全通过点对点技术实现的电子现金系统。…

Flutter 实现背景 Parallax 动画

Flutter 实现背景 Parallax 动画 原文 https://arkapp.medium.com/background-parallax-animation-in-flutter-4aa9e23d6cfb 前言 我们将创建我们的 Flutter 项目惊人的 Parallax 动画。 在本文中&#xff0c;我们将实现一个简单的实用工具 widget &#xff0c;它将在任何 widg…

Transformer/Bert

诸神缄默不语-个人CSDN博文目录 文章目录1. Transformer1.1 Transformer整体工作流程1.2 Transformer的输入1.2.1 单词 Embedding1.2.2 位置 Embedding1.3 Block1.3.1 Add & Norm层1.3.2 Self-Attention1.3.3 Multi-Head Attention1.3.4 Feed Forward1.3.5 Masked Multi-He…

[附源码]计算机毕业设计JAVA篮球装备商城系统

[附源码]计算机毕业设计JAVA篮球装备商城系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

HTTP/2是什么?和HTTP/1.1有什么不同?和SPDY有什么不同?

HTTP/2简介 HTTP/2 是超文本传输协议第2版&#xff0c;最初命名为 HTTP 2.0 &#xff0c;其简称为 h2&#xff08;基于TLS/1.2或以上版本的加密连接&#xff09;或 h2c&#xff08;非加密连接&#xff09;&#xff0c;是HTTP协议的的第二个主要版本&#xff0c;使用于万维网。 …

备考2023年软考需要了解什么?

2022年软考已经结束啦&#xff01;下半年还是有不少地区取消了&#xff0c;没能报上名或是没能正常参考的朋友们&#xff0c;只能把目光转向2023年了。 这篇文章就来给大家讲讲备考2023年软考需要了解什么&#xff1f; 软考小白必看哦&#xff01; 一、软考是啥&#xff1f;…

带你走进神奇的元宇宙的世界

&#x1f3e0;个人主页&#xff1a;黑洞晓威 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晓威&#xff0c;一名普普通通的大二在校生&#xff0c;希望在CSDN中与大家一起成长。&#x1f381;如果你也在正在学习Java&#xff0c;欢迎各位大佬来到我的博客查漏补缺…

阿里架构师推荐,微服务分布式构架开发实战PDF,快快收藏吧

什么是微服务架构 微服务是一种软件架构风格&#xff0c;目标是将一个复杂的应用拆分成多个服务模块&#xff0c;每个模块专注单一业务功能对外提供服务&#xff0c;并可以独立编译及部署&#xff0c;同时各模块间互相通信彼此协作&#xff0c;组合为整体对外提供完整服务。 微…

嵌入式开发学习之--创建工程

提示&#xff1a;本篇文章依旧是了解为主&#xff0c;实际做项目时直接找开源的类似项目做模板更效率。 文章目录一、前言二、新建工程三、使用模板工程四、总结一、前言 前面的学习&#xff0c;都是文件内的代码联系&#xff0c;这一篇&#xff0c;是学习文件与目录的联系。当…

数字信号处理-8-自相关

1 皮尔森相关系数 假设 x 和 y 均为 N 个样本的数组&#xff0c;皮尔森公式如下&#xff1a; 皮尔森相关系数总是在 -1 到 1 之间&#xff08;包含这两个字&#xff09;。ρ 的绝对值意味着相关性的强度。ρ 接近 1 表示强正相关&#xff1b;ρ 接近 -1 表示强负相关&#xf…