当前位置: 首页 > 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接口提供一个代理类

http://www.lryc.cn/news/278532.html

相关文章:

  • Unity中URP下实现能量罩(扭曲流光花纹)
  • 南京银行高管上新:“70后董事长”谢宁将上任,能否及时救场?
  • K8S容器编排基本使用
  • PyTorch 各种池化层函数全览与用法演示
  • Redis:原理速成+项目实战——Redis实战7(优惠券秒杀+细节解决超卖、一人一单问题)
  • 【刷题笔记3】
  • YOLOv8优化策略:轻量化改进 | 华为Ghostnet,超越谷歌MobileNet | CVPR2020
  • 格雷希尔G65系列快速接头满足汽车减震器的气压、油压测试要求
  • php中常用的几个安全函数
  • 【K8S 云原生】Kurbernets集群的调度策略
  • vue-office 支持多种文件(docx、excel、pdf)预览的vue组件库
  • 如何使用GaussDB创建脱敏策略(MASKING POLICY)
  • 【Golang map并发报错】panic: assignment to entry in nil map
  • 【GO语言依赖】Go语言依赖管理简述
  • 论文阅读记录SuMa SuMa++
  • 性能分析与调优: Linux 内存观测工具
  • 【ARM 嵌入式 编译系列 3.4 -- 查看所依赖库文件的路径 详细介绍】
  • 分布式锁3: zk实现分布式锁3 使用临时顺序节点+watch监听实现阻塞锁
  • google drive api
  • 3_代理模式(动态代理JDK原生和CGLib)
  • Linux的权限(1)
  • 数据安全保障的具体措施有哪些
  • 浅谈标签及应用场景
  • Linux动态分配IP与正向解析DNS
  • pyspark 使用udf 进行预测,发现只起了一个计算节点
  • mysql触发器的简单使用
  • 全志T113开发板Qt远程调试
  • 学习使用php、js脚本关闭当前页面窗口的方法
  • python 人脸检测与人脸识别
  • RT-Thread: ulog 日志 讲解和使用