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

六、代理模式

文章目录

  • 一、代理模式
    • 1、代理模式的好处和缺点
      • 1.1 代理模式理解加深



一、代理模式

  • 为什么要学习代理模式?
代理模式是Spring AOP 以及 Spring MVC 的底层!!并且还是 JAVA 的23种设计模式之一!!
  • 代理模式的分类:

    • 静态代理

    • 动态代理

  • 什么是代理模式:

如果我们出现了诉求,但是因为某些原因我们本身不想或者无法完成这种诉求,我们就需要寻求他人的帮助,由他人来完成诉求,然后我们直接获取成果就可以了。

       打个比方:学生毕业之后工作是需要租房子的,但是学生通常找不到想要把房子租出去的房主,房主也不知道那些学生想要租房子。这时候学生和房主便可以找到中介,由中介来完成租房以及找房的这个过程。最终学生和房东只需要交笔中介费便达成了自己的目的。
  • 角色分析

    • 抽象角色: 比如房东想要把房子租出去这个行为。通常会使用接口或者抽象类来解决。
    • 真实角色: 被代理的角色,比如房东。
    • 代理角色: 代理真实角色,比如中介。代理真实角色后,我们一般会做一些附属操作,比如看房、签合同等。
    • 客户角色: 访问代理对象的人!比如租房子的人。


  • 代理模式代码演示

    • 抽象角色,房东将房子租出去的诉求

      public interface HouseRental {void houseRental();
      }
      
    • 真实角色,房东本身,也就是被代理的人

      public class Homeowner implements HouseRental{@Overridepublic void houseRental() {System.out.println("房东请求中介将房子出租出去");}
      }
      
    • 代理角色,比如中介,中介代理房东将房子出租出去,并且进行相关的操作

      public class Intermediary implements HouseRental{private Homeowner homeowner;public Intermediary(Homeowner homeowner) {this.homeowner = homeowner;}@Overridepublic void houseRental() {homeowner.houseRental();seeHouse();sign();fee();}//看房public void seeHouse(){System.out.println("中介带着看房子!");}//签合同public void sign(){System.out.println("和中介签署租赁合同!");}//收费用public void fee(){System.out.println("中介收取费用!");}}
      
    • 客户角色,比如想要租房子的人

      public class Client {public static void main(String[] args) {// 租户无需直接面对房东Homeowner homeowner = new Homeowner();// 房东找到了中介,请求把房主租出去Intermediary intermediary = new Intermediary(homeowner);// 租户找到了中介,请求租房子intermediary.houseRental();}
      }
      
    • 代码执行结果:
      在这里插入图片描述



1、代理模式的好处和缺点

  • 好处

    • 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务

    • 公共角色就交给代理角色!实现了业务的分工!

    • 公共业务发生扩展的时候,方便集中管理!

  • 缺点

    • 一个真实角色就会产生一个代理角色,代码量级会翻倍,开发效率会降低。

1.1 代理模式理解加深

  • 业务场景:公司需要对用户进行增删改查操作

    • 接口

      public interface UserService {// 业务场景:公司需要对人员进行增删改查操作void add();void update();void delete();void query();}
      
    • 真实角色

      public class UserServiceImpl implements UserService{@Overridepublic void add() {System.out.println("增加了一个用户");}@Overridepublic void update() {System.out.println("修改了一个用户");}@Overridepublic void delete() {System.out.println("删除了一个用户");}@Overridepublic void query() {System.out.println("查询用户信息");}
      }
      
    • 客户端角色访问

      public class Client {public static void main(String[] args) {UserServiceImpl userService = new UserServiceImpl();userService.update();}
      }
      
    • 执行结果:修改了一个用户


  • 业务变更:公司需要对用户进行增删改查操作的同时需要将对应的操作行为以日志的形式打印出来

    • 如果在操作的同时将日志打印出来的话其实也可以,但是会有大量的代码重复操作,并且代码原则通常是不修改原本好用的代码,如果有变动一般以新增代码为主

      • 接口以及真实角色实现类内容不变,创建代理角色

        public class Proxy implements UserService{// 将真实角色进行代理private UserServiceImpl userService;// 通过 Set 方法完成代理动作public void setUserService(UserServiceImpl userService) {this.userService = userService;}public void add() {log("add");userService.add();}public void delete() {log("delete");userService.delete();}public void update() {log("update");userService.update();}public void query() {log("query");userService.query();}// 打印日志public void log(String mag){System.out.println("执行了" + mag +"方法");}
        }
        
      • 客户端调用代理角色

        public class Client {public static void main(String[] args) {// 客户端调用真实角色UserServiceImpl userService = new UserServiceImpl();// 真实角色将部分内容交给代理角色处理Proxy proxy = new Proxy();proxy.setUserService(userService);proxy.add();proxy.delete();proxy.update();proxy.query();}
        }
        
      • 执行结果

        在这里插入图片描述

相关文章:

六、代理模式

文章目录 一、代理模式1、代理模式的好处和缺点1.1 代理模式理解加深 一、代理模式 为什么要学习代理模式? 代理模式是Spring AOP 以及 Spring MVC 的底层!!并且还是 JAVA 的23种设计模式之一!! 代理模式的分类&#…...

Easy Glide

题意:给出起点终点坐标,然后给出可以经过的几个点,未经过这几个点的时候以v1的速度前进,一旦经过这些点就可以在3秒内以v2的速度前进,3秒之后恢复v1,问从起点到终点所需的最短时间 思路:最短路…...

ppt怎么压缩到10m以内?分享好用的压缩方法

PPT是一种常见的演示文稿格式,有时候文件过大,我们会遇到无法发送、上传的现象,这时候简单的解决方法就是压缩其大小,那怎么才能将PPT压缩到10M以内呢? PPT文件大小受到影响的主要因素就是以下几点: 1、图…...

VBA技术资料MF35:VBA_在Excel中过滤数据

【分享成果,随喜正能量】好马好在腿,好人好在嘴。不会烧香得罪神,不会讲话得罪人。慢慢的你就会发现,一颗好心,永远比不上一张好嘴。。 我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了&#…...

Debian12中为python3配置虚拟环境及在Pycharm中使用虚拟环境

在Debian 12中,python默认为python 3.11。 基于应用,现需设置虚拟环境。 1.安装venv模块 从python3.3开始,配置python虚拟环境,可用venv模块,更加方便了。 执行命令: #apt install python3.11-venv 2.…...

android app控制ros机器人一

android开发app,进而通过控制ros机器人,记录开发过程 查阅资料: rosjava使用较多,已经开发好的app也有开源的案例 rosjava GitHub https://github.com/ros-autom/RobotCA https://github.com/ROS-Mobile/ROS-Mobile-Android…...

二十章:基于弱监督语义分割的亲和注意力图神经网络

0.摘要 弱监督语义分割因其较低的人工标注成本而受到广泛关注。本文旨在解决基于边界框标注的语义分割问题,即使用边界框注释作为监督来训练准确的语义分割模型。为此,我们提出了亲和力注意力图神经网络(A2GNN)。按照先前的做法&a…...

webpack5 学习之路

1.视频 01-课程介绍_哔哩哔哩_bilibili 2.配套资料 依赖环境 | 尚硅谷 Web 前端之 Webpack5 教程 3.webpack 官方文档 入口起点(entry points) | webpack 中文文档 4.vue cli 官方文档 介绍 | Vue CLI 挖矿:Coding Tree...

VSCode C++ 调试方法

VSCode 调试 C 主要就是 .vscode 中的 launch.json 和 tasks.json 的配置。 launch.json 可以通过 vscode 界面 ——》左侧调试功能按钮——》创建 launch.json ——》C(GDB/LLDB)生成。 其中 launch.json 默认配置如下,主要配置项说明&…...

Java设计模式-命令模式

命令模式 1.命令模式含义 命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。对请求排队或记录请求日志,以及支持可撤销的操作。 命令模式乍一看,有点懵懵的。即使这个定义看完,也是不明…...

Linux编译宏BUILD_BUG_ON_ZERO

本系列文章主要写我在阅读Linux内核过程中,关注的比较难以理解但又设计巧妙的代码片段(不关注OS的各个模块的设计思想,此部分我准备写在“深入理解Linux Kernel”系列文章中),一来通过内核代码复习一下C语言及汇编语言…...

从Arweave开始:4EVERLAND存储签入挑战开始

嗨,4evers, 今天,我们热烈欢迎您参加 Galxe 上的 4EVERLAND “Arweave 入门”活动。这是一项长期的重头活动,所有参与的用户都有机会获得相应的奖励。 Arweave 是一种革命性的去中心化存储协议,为寻求安全可靠的有价…...

数据结构—链表

链表 前言链表链表的概念及结构链表的分类 无头单向非循环链表的相关实现带头双向循环链表的相关实现顺序表和链表(带头双向循环链表)的区别 前言 顺序表是存在一些固有的缺陷的: 中间/头部的插入删除,时间复杂度为O(N)&#xf…...

windows 10/11 修改右键新建菜单

问题:修改右键新建菜单内容 解决方法:使用软件ShellNew Settings 1.打开软件 2.根据需要取消勾选项 3.最终效果...

6.修饰符

文章目录 6.1 在一个静态方法内调用一个非静态成员为什么是非法的?6.2 静态方法和实例方法有何不同 6.1 在一个静态方法内调用一个非静态成员为什么是非法的? 由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量&#xff0…...

【leetcode难题】2569. 更新数组后处理求和查询【线段树实现01翻转和区间求和模版】

题目截图 题目分析 关键就是记录每次操作2时,nums1中的1的个数这就需要实现线段树进行区间反转以及区间求和 ac code class Solution:def handleQuery(self, nums1: List[int], nums2: List[int], queries: List[List[int]]) -> List[int]:n len(nums1)m le…...

练习时长两年半的入侵检测

计算机安全的三大中心目标是:保密性 (Conf idential ity) 、完整性 (Integrity) 、可用性 (Availability) 。 身份认证与识别、访问控制机制、加密技术、防火墙技术等技术共同特征就是集中在系统的自身加固和防护上,属于静态的安全防御技术,…...

【弹力设计篇】聊聊隔离设计

为什么需要隔离设计 隔离其实就是Bulkheads,隔板。在生活中隔板的应用主要在船舱中进行设计,目的是为了避免因一处漏水导致整个船都沉下去。可以将故障减少在一定的范围内,而不是整个船体。 从架构演变来说的话,大多数系统都是从…...

MFC 透明窗体

如何制作透明窗体 ????? 使用SetLayeredWindowAttributes可以方便的制作透明窗体,此函数在w2k以上才支持,而且如果希望直接使用的话,可能需要下载最新的SDK。不过此函数在w2k的user32.dll里有实…...

C++笔记之vector的resize()和clear()用法

C笔记之vector的resize()和clear()用法 code review! 文章目录 C笔记之vector的resize()和clear()用法1.resize()2.clear() 1.resize() 运行 2.clear() 运行...

2026届学术党必备的十大AI写作助手推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网AIGC检测服务的目的是辅助识别学术文本里由人工智能生成的内容,该技术凭借对…...

【FMCW雷达】频率调制连续波FMCW雷达系统(从波形生成到利用小胞平均常误报率CA-CFAR进行目标检测)【含Matlab源码 15242期】含报告

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞…...

嵌入式系统电源时序控制原理与实现

1. 电源时序控制基础概念在现代电子系统中,多电压域设计已成为常态。一个典型的嵌入式系统可能同时需要1.2V(核心逻辑)、3.3V(外设接口)和1.5V(特殊功能模块)等多种电压。这些电源的上电顺序对系…...

seo优化机构怎样选择才合适_什么是seo优化机构

SEO优化机构怎样选择才合适_什么是SEO优化机构 在当今的数字化时代,拥有一个高效的网站已经不再是企业竞争力的唯一标准,更重要的是这个网站能够在搜索引擎上获得良好的排名。这就是搜索引擎优化(SEO)的重要性所在。选择一个合适…...

成为技术专家的捷径?不,只有长期主义的坚持

在软件测试领域,我们常常被一种“速成”的幻象所包围。铺天盖地的培训广告承诺“三个月精通自动化测试”、“六周成为性能测试专家”,各种“一招鲜”的测试工具和“万能”的测试框架被包装成通往成功的捷径。对于身处其中、渴望突破职业瓶颈的测试工程师…...

StructBERT文本相似度模型Java开发实战:SpringBoot集成与API调用

StructBERT文本相似度模型Java开发实战:SpringBoot集成与API调用 你是不是也遇到过这样的场景?用户搜索“苹果手机”,你希望系统不仅能返回iPhone,还能识别出“苹果公司手机”、“Apple iPhone”这些同义查询。或者,在…...

快马平台十分钟速建:openclaw机器人抓取参数可视化配置原型

最近在做一个机器人抓取控制的项目,需要快速搭建一个openclaw的参数配置界面。作为一个前端开发经验不多的工程师,我惊喜地发现InsCode(快马)平台可以帮我快速实现这个需求。下面分享下我的实现过程。 首先明确需求 这个配置工具需要实现五个核心功能&a…...

Ollama在Apple Silicon上预览,性能大提升

2026年3月30日,Ollama开启在Apple silicon上的预览,由苹果MLX框架支持,解锁新性能,加速繁重工作,还在多方面有显著改进。MLX驱动,性能飞升基于Apple silicon的Ollama构建在MLX框架上,利用统一内…...

华为HMS Scan Kit Customized View Mode:打造品牌专属扫码界面的实战指南

1. 为什么选择Customized View Mode? 扫码功能已经成为现代App的标配,但很多开发者面临一个两难选择:要么用系统默认的扫码界面显得千篇一律,要么完全自己开发一套又耗时耗力。华为HMS Scan Kit的Customized View Mode正好解决了这…...

VMware 16 安装win,Win11推荐下载链接(不要选arm)

目录Win11下载链接待续、更新中......Win11下载链接 ed2k://|file|zh-cn_windows_11_consumer_editions_version_22h2_updated_sep_2022_x64_dvd_23d39103.iso|5579771904|33C7EC6485AD8C55ADFB550FA1A0F270|/ 待续、更新中… 1 顿号、: 先使用ctrl. ,再使用一遍切…...