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

设计模式(12):代理模式

一.核心作用

  • 通过代理,控制对对象的访问;
  • 可以详细控制访问某个对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。

二.核心角色

  • 抽象角色: 定义代理角色和真实角色的公共对外方法;
  • 真实角色: 实现抽象角色,定义真实角色suo’yao实现的业务逻辑,供代理角色调用;
  • 代理角色: 实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。将统一的流程控制放到代理角色中处理。

三.应用场景

  • 安全代理: 屏蔽对真实角色的直接访问;
  • 远程访问: 通过代理类处理远程方法调用;
  • 延迟加载: 先加载轻量级的代理对象,真实需要再加载真实对象。

四.分类

  • 静态代理: 静态定义代理类
  • 动态代理: 动态生成代理类

五.动态代理类生成方式

  • JDK自带的动态代理;
  • CGLIB实现;
  • javaassist字节码操作库实现;
  • ASM(底层使用指令,可维护性较差)

六.动态代理相比静态代理的优点

  • 抽象角色中声明的所有方法都被转移到调用处理器一个集中的方法中处理,这样,我们可以更新灵活和统一的处理众多的方法。

七.JDK自带的动态代理

  • java.lang.reflect.Proxy
    • 动态生成代理类和对象;
  • java.lang.reflect.InvocationHandler
    • 可以通过invoke方法实现对真实角色的代理访问;
    • 每次通过Proxy生成代理类对象时都有指定对应的处理器对象

八.举例代码实现

  • 例:

    • 以金南铃演出为例,假如客户邀请金南玲演出唱歌,要做这些事情:面试、签合同、订票、唱歌、收钱。如果金南玲演出少,那么这些事情她自己就可以干;如果演出多,与每个客户合作她自己都有干这么多事,很繁琐;金南玲她自己主要业务就是唱歌,那么唱歌之前和之后的事都可以交给别人来做,很自然的就产生了经纪人概念。除了唱歌由金南玲本人来做,其它事情都交给经纪人做。这理的经纪人就是我们所说的代理。
  • 1.代码实现

    • 抽象角色类
/*** 抽象角色*/
public interface Star {//面试void confer();//签合同void singContract();//订票void bookTicket();//唱歌void sing();//收尾款void collectMoney();
}
    • 真实角色类
/*** 真实角色*/
public class RealStar implements Star {@Overridepublic void confer() {System.out.println("面试");}@Overridepublic void singContract() {System.out.println("签合同");}@Overridepublic void bookTicket() {System.out.println("订票");}@Overridepublic void sing() {System.out.println("金南铃本人演唱《逆流成河》");}@Overridepublic void collectMoney() {System.out.println("收钱");}
}
    • 静态代理——代理角色
/*** 代理角色*/
public class ProxyStar implements Star{private RealStar realstar;public ProxyStar(RealStar realstar) {this.realstar=realstar;}@Overridepublic void confer() {System.out.println("面试");}@Overridepublic void singContract() {System.out.println("签合同");}@Overridepublic void bookTicket() {System.out.println("订票");}@Overridepublic void sing() {realstar.sing();}@Overridepublic void collectMoney() {System.out.println("收钱");}
}
    • 静态代理——客户调用
/*** 静态代理*/
public static void main(String[] args) {RealStar realstar=new RealStar();ProxyStar proxystar=new ProxyStar(realstar);proxystar.confer();proxystar.singContract();proxystar.bookTicket();proxystar.sing();proxystar.collectMoney();
}
    • 动态代理——代理角色
/***  动态代理实现代理模式*		 动态代理类 */
public class HandlerStar implements InvocationHandler,Star{private Star star;public HandlerStar(Star star) {this.star = star;}@Overridepublic Object invoke(Object proxy, Method method, Object[] o) throws Throwable {confer();singContract();bookTicket();Object invoke = method.invoke(star, o);collectMoney();return invoke;}@Overridepublic void confer() {System.out.println("代理面试");}@Overridepublic void singContract() {System.out.println("代理签合同");}@Overridepublic void bookTicket() {System.out.println("代理订票");}@Overridepublic void sing() {}@Overridepublic void collectMoney() {System.out.println("代理收钱");}
}
    • 动态代理——客户调用
/***  动态代理实现代理模式*/
public static void main(String[] args) {Star star=new RealStar();HandlerStar handler=new HandlerStar(star);Star proxy=(Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class} , handler);proxy.sing();
}



更多设计模式学习:

          设计模式(1):介绍
          设计模式(2):单例模式
          设计模式(3):工厂模式
          设计模式(4):建造者模式
          设计模式(5):原型模式
          设计模式(6):桥接模式
          设计模式(7):装饰器模式
          设计模式(8):组合模式
          设计模式(9):外观模式
          设计模式(10):享元模式
          设计模式(11):适配器模式
          设计模式持续更新中…

相关文章:

设计模式(12):代理模式

一.核心作用 通过代理,控制对对象的访问;可以详细控制访问某个对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。 二.核心角色 抽象角色: 定义代理角色和真实角色的公共对外方法;真实角色: 实现抽…...

前端9种图片格式基础知识, 你应该知道的

彩色深度 彩色深度标准通常有以下几种: 8位色,每个像素所能显示的彩色数为2的8次方,即256种颜色。16位增强色,16位彩色,每个像素所能显示的彩色数为2的16次方,即65536种颜色。24位真彩色,每个…...

ChatGPT 与 OpenAI 的现代生成式 AI(上)

原文:Modern Generative AI with ChatGPT and OpenAI Models 译者:飞龙 协议:CC BY-NC-SA 4.0 序言 本书以介绍生成式 AI 领域开始,重点是使用机器学习算法创建新的独特数据或内容。它涵盖了生成式 AI 模型的基础知识&#xff0c…...

全量知识系统 程序详细设计之架构设计:一个信息系统架构

统架构,整体设计分成了三部分--三种方面:信息nformation、系统Syste 原文 以下是对全知系统程序详细设计需要的架构规划的考虑。 全知系统架构是一个信息系统架构,整体设计分成了三部分(三种“方面”):信…...

从零开始:成功进入IT行业的方法与技巧

如今,信息技术(IT)行业成为了就业市场上的热门领域。由于其快速发展和广阔的职业机会,许多人希望能够进入这个行业。然而,对于没有任何相关背景知识的人来说,要成功进入IT行业可能会面临一些挑战。本文将分…...

SpringCloud - 如何本地调试不会注册到线上环境(Nacos)?

问题描述 有时候我们需要本地调试注册到 Nacos 上,但是会影响线上服务的 Feign 请求打到本地导致不通影响了线上业务。 原因分析 一般最传统的解决方案就是修改本地 bootstrap.yml 的 spring.cloud.nacos.discovery.namespace spring:application:name: app-serv…...

1.9 面试经典150题 除自身以外数组的乘积

除自身以外数组的乘积 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0…...

【美团笔试题汇总】2023-09-02-美团春秋招笔试题-三语言题解(CPP/Python/Java)

🍭 大家好这里是KK爱Coding ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新美团近期的春秋招笔试题汇总~ 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢&#x1f…...

小黑逆向爬虫探索与成长之路:小黑独立破解毛毛租数据加密与解密

前言 有道和招标网的加密入口定位在前面两期做了详细的介绍,本小结将通过简单的关键词搜索定位到加密与解密入口 数据接口寻找与请求 根据响应数据长度,确定数据接口,发现传入的参数需要加密,响应的结果需要解密,后…...

Generative Question-Answering with Long-Term Memory

...

深入浅出 -- 系统架构之微服务架构常见的六种设计模式

面向服务的架构(SOA) 面向服务的架构(SOA)是一种设计方法,也是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的…...

SSM框架学习——SqlSession以及Spring与MyBatis整合

SqlSession以及Spring与MyBatis整合 准备所需要的JAR包 要实现MyBatis与Spring的整合,很明显需要这两个框架的JAR包,但是只是使用这两个框架中所提供的JAR包是不够的,还需要配合其他包使用: Spring的JAR包MyBatis的JAR包Spring…...

6、【单例模式】确保了一个类在程序运行期间只有一个实例

你好,我是程序员雪球 在软件设计中,单例模式是一种常见的设计模式。它确保了一个类在程序运行期间只有一个实例,并提供了全局访问该实例的方式。单例模式在许多场景中都有广泛的应用,例如共享资源管理、数据库连接、日志记录器等…...

vuex插件实现数据共享

vuex插件 vuex是管理多个vue通用的数据的插件.(状态管理工具,状态是数据) 我们对于多个vue文件之间的共同数据,是用props传递,或者对于一个vue实例对象,进行绑定,传参,也是多次传参,多个文件之间,比较麻烦. 但是我们vuex会创建一个公共对象,从这个公共对象上赋值,比较简单易…...

【吊打面试官系列】Redis篇 - 使用过 Redis 分布式锁么,它是什么回事?

大家好,我是锋哥。今天分享关于 【使用过 Redis 分布式锁么,它是什么回事?】面试题,希望对大家有帮助; 使用过 Redis 分布式锁么,它是什么回事? 先拿 setnx 来争抢锁,抢到之后&#…...

DashOJ-8.奇偶统计

题目链接: 题目详情 - 奇偶统计 - DashOJ 思路: (while循环加if分支语句) 巧用死循环 while(1) 然后在里面第一句就判断输入的数字是否等于0 if(x0) ,如果 等于0就直接break跳出循环 或者用 while(cin>>x) 代…...

车源宝微信小程序源码

源码介绍 车源宝微信小程序源码 images — 存放项目图片文件 pages — 存放项目页面相关文件 store — 存放数据接口文件 utils — 存放时间格式化等文件 演示截图 源码下载 https://download.csdn.net/download/huayula/89082980...

“双碳”目标下资源环境中的可计算一般均衡(CGE)模型应用

我国政府承诺在2030年实现“碳达峰”,2060年实现“碳中和”,这就是“双碳”目标。为了实现这一目标就必须应用各种二氧化碳排放量很高技术的替代技术,不仅需要考虑技术上的可靠性,也需要考虑经济上的可行性。可计算一般均衡模型&a…...

在 Git Bash 中调整字体大小,可以按照以下步骤进行操作,注意这里是linux虚拟机,命令都是Linux方式的

在 Git Bash 中调整字体大小,可以按照以下步骤进行操作: 打开 Git Bash 终端。 在终端中,点击顶部菜单栏的 "Options"(选项)。 在弹出的下拉菜单中,选择“text”文本 右侧font那里&#xf…...

STM32之HAL开发——不同系列SPI功能对比(附STM32Cube配置)

不同系列STM32——SPI框图 F1系列框图 F4系列框图 TI模式时序图特性 F7系列框图 H7系列框图 注意:F7系列以及H7系列支持Quad-SPI模式,可以连接单,双或者四条数据线的Flash存储介质。 SPI——Cube配置流程 RCC时钟源配置 SYS系统调试模式配…...

如何一键解决Windows与iPhone网络共享驱动问题:Apple-Mobile-Drivers-Installer完整指南

如何一键解决Windows与iPhone网络共享驱动问题:Apple-Mobile-Drivers-Installer完整指南 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目…...

解锁MapleStory游戏资源编辑的终极指南:Harepacker-resurrected深度解析

解锁MapleStory游戏资源编辑的终极指南:Harepacker-resurrected深度解析 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected 你是否曾…...

ISE 14.7 最后的倔强:手把手教你给CPLD烧录程序(附JTAG连接避坑指南)

ISE 14.7 最后的倔强:手把手教你给CPLD烧录程序(附JTAG连接避坑指南) 在Vivado大行其道的今天,ISE 14.7这个"老古董"依然活跃在某些工程师的工作站上。这不是技术怀旧,而是实实在在的工程需求——当你面对一…...

YOLO11涨点优化:数据增强 | 引入AutoAugment自动化搜索增强策略,告别手工调参,挖掘最优数据配方

引言:YOLO11训练,为何你的mAP总是差一口气? 训练一个YOLO11模型并不难——几行Python代码就能跑起来。但真正让人崩溃的是:数据标注花了两周,超参数调了三天,mAP就涨了0.3个点。你反复调整旋转角度、翻转概率、HSV色彩偏移的幅度,试图找到那组“最佳”的组合,却发现自…...

解锁加密压缩包的终极武器:ArchivePasswordTestTool密码恢复方案全解析

解锁加密压缩包的终极武器:ArchivePasswordTestTool密码恢复方案全解析 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 你是否曾…...

用PyQt5给树莓派人脸门禁做个漂亮界面:从Qt Designer设计到跨平台移植的保姆级教程

树莓派人脸门禁系统GUI开发实战:从Qt设计到跨平台部署全解析 在智能硬件开发领域,树莓派因其出色的性价比和丰富的扩展性,成为创客和开发者的首选平台。而将人脸识别技术与树莓派结合,打造一套完整的门禁系统,不仅考验…...

Shotgun Code最佳实践:10个提高AI代码生成质量的关键技巧

Shotgun Code最佳实践:10个提高AI代码生成质量的关键技巧 【免费下载链接】shotgun_code One‑click codebase “blast” for Large‑Language‑Model workflows. 项目地址: https://gitcode.com/gh_mirrors/sh/shotgun_code Shotgun Code作为一款面向大语言…...

开发容器实战:用Dev Containers统一团队开发环境,告别配置地狱

1. 项目概述与核心价值 最近在折腾一个跨平台协作的项目,团队里有人用 Mac,有人用 Windows,还有人用 Linux 桌面,开发环境配置起来简直是“八仙过海,各显神通”,但结果往往是“一地鸡毛”。一个依赖版本不…...

右单旋的具体情况

右单旋的具体情况1、h为02、h为13、h为24、h为3在“AVL树的模拟实现”一文中,我们学习到旋转调整方法的时候,使用的需要旋转调整的示例,都是一些抽象的二叉搜索树: 如图的树a, b, c都是抽象的树。插入节点(红色方框&am…...

Dev Containers实战:容器化开发环境配置与团队协作指南

1. 项目概述:一个容器化的开发环境定义仓库如果你和我一样,经常需要在不同的机器上切换工作,或者团队里有新成员加入,那么“环境配置”这件事,绝对能排进程序员最头疼问题的前三名。我经历过无数次这样的场景&#xff…...