Java核心设计模式:代理设计模式

一、生活中常见的代理案例

  • 房地产中介:客户手里没有房源信息,找一个中介帮忙
  • 商品代购:代理者一般有好的资源渠道,降低购物成本(如海外代购,自己不用为了买东西出国)

二、为什么要使用代理

  • 对于消费者来说,可以减少成本,只需要关心自己需要的商品,不需要寻找资源

三、代理模式在Java中的应用

  • 统一异常处理
  • Mybatis使用了代理

  • Spring Aop实现原理
  • 日志框架

四、什么是代理模式

1、代理模式(Proxy Pattern):23种设计模式之一,属于结构模式,指的是一个对象本身不做实际操作,而是通过其他对象来得到自己想要的结果

2、意义:目标对象只需要关心自己的实现细节,通过代理对象实现功能的增强,可以扩展目标对象的功能

3、重要思想:不能随便修改源码,如果要修改源码,通过修改代理的方式实现功能的拓展

五、代理的图例释义

以房地产中介为例:

六、Java中代理的实现方式

 

1、元素组成:

接口,定义行为和规范

被代理类,是目标对象

代理类,做功能增强的

2、静态代理(了解)

2.1案例

通过代理模式实现事务操作

2.2实现案例

创建domain(POJO)对象

创建service接口定义规范

创建实现类(impl),被代理类

创建事务对象(前置通知与后置通知)

创建代理类对象(Proxy):实现(implement)接口,访问实现类

创建测试类测试代理类对象

2.3存在的问题

1)不利于代码拓展,比如说接口新添一个抽象方法,所有实现类都需要重新实现

2)代理对象要创建很多,非常不利于代码维护

3、动态代理(掌握)

3.1概述:

不改变原有功能代码的前提下,动态的实现方法的增强

3.2JDK动态代理

3.2.1基础准备
  • 创建POJO类
package cn.yxcode.domain;
import lombok.Data;
//  Lombok是一个Java库,能自动插入编辑器并构建工具简化Java开发。
//  通过添加注解的方式,不需要为类编写getter或eques方法,同时可以自动化日志变量。
//   添加该插件请在pom.xml中进行配置
//创建学生类
@Data
public class Student {private  String name;private int age;
}
  • 创建service接口
  • public interface IstudentService{/***添加学生*/void save();/***查询学生信息*@param id*@return*/Student query(Long id);
    }

  • 创建service实现类(需要代理的类)
package cn.yxcode.sevice.impl;
//创建service实现类(需要代理的类)
import cn.yxcode.sevice.IstudentService;
import cn.yxcode.sevice.cn.Student;public class StudentServiceimpl implements IstudentService {@Overridepublic void save() {System.out.println("保存学生信息");}@Overridepublic Student query(Long id) {System.out.println("查询操作");Student student=new Student();student.setName("yx");student.setAge(20);return student;}
}
  • 增强类
package cn.yxcode.transaction;
//增强类
public class DaoTransaction {public void before(){System.out.println("开启事务操作");}public void after(){System.out.println("关闭事务");}
}
3.2.2实现InvocationHandler接口
InvocationHandler接口:用来做方法拦截
package cn.yxcode.handle;import cn.yxcode.sevice.IstudentService;
import cn.yxcode.transaction.DaoTransaction;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;//创建处理事务的一个类
public class TransactionHandle implements InvocationHandler {
//InvocationHandler接口:用来做方法拦截/*** proxy:可以通过newPoxyinstance创建代理实例* Method:执行目标方法,invoke方法执行* args:参数数组*/
//    增强类对象private DaoTransaction transaction;
//     private IstudentService istudentService;由于未来开发不止一个service所以用Object代替效果
//      需要代理的对象private Object obj;public TransactionHandle(DaoTransaction transaction,Object obj){this.transaction=transaction;this.obj=obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object ret=null;//      判断当前方法是否为save,是才做事务操作if ("save".equals(method.getName())){transaction.before();ret= method.invoke(obj,args);transaction.after();}else {ret= method.invoke(obj,args);}return ret;}
}
3.2.3测试实现
package cn.yxcode;
import cn.yxcode.domain.Student;
import cn.yxcode.handle.TransactionHandle;
import cn.yxcode.sevice.IstudentService;
import cn.yxcode.sevice.impl.StudentServiceimpl;
import cn.yxcode.transaction.DaoTransaction;
import org.junit.Test;import java.lang.reflect.Proxy;public class TestStudent {@Testpublic void testSave(){
//    增强类对象(前置通知和后置通知)DaoTransaction transaction =new DaoTransaction();
//    目标执行类(即接口和实现类)IstudentService service= new StudentServiceimpl();
//    方法拦截处理器TransactionHandle handle= new TransactionHandle(transaction,service);
//    获取代理实例对象IstudentService ProxystudentService=(IstudentService) Proxy.newProxyInstance(StudentServiceimpl.class.getClassLoader(),StudentServiceimpl.class.getInterfaces(),handle);ProxystudentService.save();Student query=ProxystudentService.query(1);}
}
//newProxyInstance(类加载器,目标类所实现的所有接口 ,方法拦截器实现方法的增强)

效果

未完待续........

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

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

相关文章

编程揭秘刘谦春晚魔术(约瑟夫环问题Josephus)

哈喽~各位过年好哇! 相信大家应该都看了春晚刘谦表演的魔术吧,大家当时有没有跟着做成功呢,其实背后的原理很简单,现在我们来逐句分析,一起探索其中的原理吧! 首先,有四张牌假设为1&#xff0…

【Rust】——猜数游戏

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

MySQL篇----第十七篇

系列文章目录 文章目录 系列文章目录前言一、对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题二、解释 MySQL 外连接、内连接与自连接的区别三、Myql 中的事务回滚机制概述前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

redis之布隆过滤

目录 1、redis之布隆过滤 2、布隆过滤器原理 3、布隆过滤器使用步骤 初始化bitmap 添加占坑位 判断是否存在圜 1、redis之布隆过滤 布隆过滤:有一个初值都为0的bit数组和多个哈希函数构成,用来快速判断集合中是否存在某个元素。目的:减…

顶级思维方式——认知篇三(财富与金钱)

目录 1、 什么是财富/财富的定义? 2、财富的影响 3、 财富意味着什么? 4、财富与幸福的关系 5、物质财富如何使用才有实际意义? 6、金钱的运作方式 7、【物质财富自由】后的选择 1、 什么是财富/财富的定义? 财富是一个多维…

c++之说_14|左值引用与右值引用

提起左右值引用我就头疼 左值: 1、在内存中开辟了空间的便叫左值 2、左值不一定可以赋值 如字符串常量 3、左值可以取地址 右值: 1、在内存中没有开辟空间的 2、右值无法取地址 如: 立即数(1,2,3…

移动端web开发布局

目录 flex布局: flex布局父项常见属性: flex布局子项常见属性: REM适配布局: 响应式布局: flex布局: 需要先给父类盒子设置display:flex flex是flexiblebox的缩写,意为"弹…

面试经典150题——三数之和

​"The road to success and the road to failure are almost exactly the same." - Colin R. Davis 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力方法 因为三个数相加为0,那么说明其中两个加数的和与另一个加数为相反数则满足题意。所以可以得到…

猫头虎分享已解决Bug || IndexError: index 3 is out of bounds for axis 0 with size 3

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

解决挂梯子 无法正常上网 的问题

方法: 打开 控制面板 👉 网络和Internet 👉 Internet选项 👉 连接 👉 局域网设置 👉 代理服务器 👉 取消选项 有问题可参考下图

案例:三台主机实现 级联复制

介绍:级联复制架构 级联复制架构 是一种特殊的主从结构,之前聊到的几种主从结构都只有两层,但级联复制架构中会有三层,关系如下: 也就是在级联复制架构中,存在两层从库,这实际上属于一主多从架…

Failed to construct ‘RTCIceCandidate‘ sdpMid and sdpMLineIndex are both null

最近在搞webrtc,在编写函数处理远端传递来的candidate时报错了,具体信息如下。国内关于webrtc的资料很少,所以去国外社区转了一圈,回来记录一下报错的解决方案 其实这个bug也好解决,根据报错信息可以判断是RTCIceCand…

C语言第二十二弹---指针(六)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 指针 1. 回调函数是什么? 2、qsort使用举例 2.1、使用qsort函数排序整型数据 2.2 使用qsort排序结构体数据 3、qsort函数的模拟实现 总结 1. 回…

龙年,大吉

(1) 没有成功的企业,只有时代的企业。这就是人们老说的:天道酬勤。虽然这句话被人说滥了,虽然这句话被人说到反感了,但事实就是这样。 得道者多助。 (2) 人有三大运、三小运。 三大运…

Python基础语法(内置Python, pycharm配置方式)

一.工具安装与配置 1.Python解释器的安装 官网网址:https://www.python.org/ 选择downloads即可(Windows用户点击Windows, 苹果用户点击macOS) 找到最新版本, 并选择 Download Windows installer (64-bit) 下载完成后可在得到一个安装包进行安装(安装时间较长) 安装完成后…

【JMX】JAVA监控的基石

目录 1.概述 2.MBean 2.1.Standard MBean 2.2.Dynamic MBean 2.3.Model Bean 2.4.Dynamic MBean和Model Bean的区别 2.5.MXBean 2.6.Open Bean 3.控制台 1.概述 什么是JMX,首先来看一段对话: Java Management Extensions(JMX&#…

【Wio Terminal教程】使用LCD屏幕(4)

使用LCD屏幕(4) 一、TFT LCD的API例子1、实用图形2、数据显示3、字体4、作为背景显示 二、如何在Wio Terminal上使用LVGL图形库1、安装Seeed_Arduino_LvGL2、示例1. Bench Mark2. Stress Test3.资源 一、TFT LCD的API例子 本节为TFT LCD库的例子提供了一…

ERROR: Could not build wheels for roslz4

Python bugs 最近在安装python的rosbag包时出现了诸多问题,特别记录下。 python版本:3.11 系统版本:Windows10 x86_64 使用conda虚拟环境进行包管理。 运行命令 pip3 install roslz4 --extra-index-url https://rospypi.github.io/simple…

【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘&am…

|Python新手小白低级教程之项目篇——turtle库|第一章:turtle库基础(1)

项目篇—文章目录 一、预告二、turtle基础1.导入2.画图代码(1)turtle.forward(长度)练习1.1 画线段 (2)turtle.left()和turtle.right()操作符练习2.1 画出边长为100正方形练习2.2 画出边长为100的三角形 (3&#xff09…