当前位置: 首页 > news >正文

12GoF之代理模式

解决问题的思维:AOP

解决问题技术:代理技术

代理技术太麻烦,因此使用框架

Spring AOP框架(底层是代理技术:jdk动态daili,cglib)

  • 代理模式是GoF23种设计模式之一。属于结构型设计模式。

  • 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不应该看到的内容和服务或者添加客户需要的额外服务。 通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机。

  • 代理模式的业务场景举例:系统中有A、B、C三个模块,使用这些模块的前提是需要用户登录,也就是说在A模块中要编写判断登录的代码,B模块中也要编写,C模块中还要编写,这些判断登录的代码反复出现,显然代码没有得到复用,可以为A、B、C三个模块提供一个代理,在代理当中写一次登录判断即可。代理的逻辑是:请求来了之后,判断用户是否登录了,如果已经登录了,则执行对应的目标,如果没有登录则跳转到登录页面。【在程序中,目标不但受到保护,并且代码也得到了复用。】

  • 代理模式中的角色
    ● 代理类(代理主题)
    ● 目标类(真实主题)
    ● 代理类和目标类的公共接口(抽象主题):客户端在使用代理类时就像在使用目标类,不被客户端所察觉,所以代理类和目标类要有共同的行为,也就是实现共同的接口。

  • 代理模式的类图:
    在这里插入图片描述

  • 代理模式的两种形式:
    静态代理
    动态代理

静态代理

现在有这样一个接口和实现类:

package com.sunsplanter.mall.service;public interface OrderService {/*** 生成订单*/void generate();/*** 查看订单详情*/void detail();/*** 修改订单*/void modify();
}

OrderService接口的实现类

package com.sunsplanter.mall.service.impl;import com.sunsplanter.mall.service.OrderService;public class OrderServiceImpl implements OrderService {@Overridepublic void generate() {try {Thread.sleep(1234);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("订单已生成");}@Overridepublic void detail() {try {Thread.sleep(2541);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("订单信息如下:******");}@Overridepublic void modify() {try {Thread.sleep(1010);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("订单已修改");}
}

其中Thread.sleep()方法的调用是为了模拟操作耗时。

项目已上线,并且运行正常,只是客户反馈系统有一些地方运行较慢,要求项目组对系统进行优化。于是项目负责人就下达了这个需求。首先需要搞清楚是哪些业务方法耗时较长,于是让我们统计每个业务方法所耗费的时长。

解决办法:使用代理模式(这里采用动态代理)为OrderService接口提供一个代理类

相关文章:

  • Hutool sqlserver 数据库简单操作-Db
  • Linux 【C编程】IO进阶— 阻塞IO、非阻塞IO、 多路复用IO、 异步IO
  • 阶段七第二章 性能测试工具
  • word写标书的疑难杂症总结
  • leetcode82. 删除排序链表中的重复元素 II
  • 网络安全产品之认识WEB应用防火墙
  • 常用Java代码-Java中的Lambda表达式和函数式接口
  • 通过myBatis将sql语句返回的值自动包装成一个java对象(3)
  • [链路层] 点对点协议 PPP
  • 图解拒付平台:如何应对用户的拒付
  • Linux IDEA 安装及环境配置
  • Spark Doris Connector 可以支持通过 Spark 读取 Doris 数据类型不兼容报错解决
  • Stable Diffusion的 webui 如何在Windows上使用 AMD GPU显卡?
  • Ubuntu12.0安装g++过程及其报错
  • 03 SpringMVC响应数据之接收Cookie和请求头+原生API+共享域对象操作
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CentOS从零开始部署Nodejs项目
  • emacs初体验
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Js基础知识(四) - js运行原理与机制
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 飞驰在Mesos的涡轮引擎上
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 《码出高效》学习笔记与书中错误记录
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • (arch)linux 转换文件编码格式
  • (C语言)fgets与fputs函数详解
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 事件模型教程(二)
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NetCore部署微服务(二)
  • .net反编译工具
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • /var/log/cvslog 太大
  • @property python知乎_Python3基础之:property
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包
  • [GN] Vue3快速上手1
  • [hive] 窗口函数 ROW_NUMBER()
  • [js]js设计模式小结
  • [LeetCode] 2.两数相加
  • [linux] shell中的()和{}
  • [MySQL光速入门]003 留点作业...
  • [nginx] LEMP 架构随笔
  • [Notes]python argparse模块
  • [PHP] 算法-顺时针打印矩阵的PHP实现