六、代理模式

news2024/9/25 11:18:24

文章目录

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



一、代理模式

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

    • 静态代理

    • 动态代理

  • 什么是代理模式:

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

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

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


  • 代理模式代码演示

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

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

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

      public class Intermediary implements HouseRental{
      
          private Homeowner homeowner;
      
          public Intermediary(Homeowner homeowner) {
              this.homeowner = homeowner;
          }
      
          @Override
          public 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{
      
          @Override
          public void add() {
              System.out.println("增加了一个用户");
          }
      
          @Override
          public void update() {
              System.out.println("修改了一个用户");
          }
      
          @Override
          public void delete() {
              System.out.println("删除了一个用户");
          }
      
          @Override
          public 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();
            }
        }
        
      • 执行结果

        在这里插入图片描述

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

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

相关文章

【TI毫米波雷达笔记】IWR6843AOP工程模板创建 cannot find file “libsleep_xwr68xx.aer4f“等解决方案

【TI毫米波雷达笔记】IWR6843AOP工程模板 cannot find file “libsleep_xwr68xx.aer4f” 解决方案 我在建立工程时 发现了一个问题 参考: blog.csdn.net/qq_16660871/article/details/126246572报错为 cannot find file "libsleep_xwr68xx.aer4f"最后检…

【Linux】深入理解缓冲区

目录 什么是缓冲区 为什么要有缓冲区 缓冲区刷新策略 缓冲区在哪里 手动设计一个用户层缓冲区 什么是缓冲区 缓冲区本质上一块内存区域,用来保存临时数据。缓冲区在各种计算任务中都广泛应用,包括输入/输出操作、网络通信、图像处理、音频处理等。 …

Nodejs 第一章(介绍)

概述 nodejs 并不是JavaScript应用,也不是编程语言,因为编程语言使用的JavaScript,Nodejs是 JavaScript的运行时。 Nodejs是构建在V8引擎之上的,V8引擎是由C/C编写的,因此我们的JavaSCript代码需要由C/C转化后再执行。 NodeJs 使…

看了这篇文章,我也会用grid布局了

grid网格布局 网格布局是由一系列水平及垂直的线构成的一种布局模式,使用网格,我们能够将设计元素进行排列,帮助我们设计一系列具有固定位置以及宽度的元素的页面,使我们的网站页面更加统一。 它将网页划分成一个个网格&#xff…

Cilium系列-6-从地址伪装从IPtables切换为eBPF

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于: 启用本地路由(Native Routing)完全替换 KubeProx…

探索大型语言模型的开源人工智能基础设施:北京开源AI Meetup回顾

原文参见Explore open source AI Infra for Large Language Models: Highlights from the Open Source AI Meetup Beijing | Cloud Native Computing Foundation 背景介绍: 最近,在 ChatGPT 的成功推动下,大型语言模型及其应用程序的流行度激…

递归实现 组合问题+排列问题(DFS)

递归不是循环,递归利用了系统栈,只要是函数都会被系统管理。当执行到函数地址入口时就会为函数在系统栈上分配一块内存。当函数在自己内部再次调用自己,那么系统又会给此时调用的函数再次分配内存,结果说就是层层调用。递归就是这…

【硬件设计】数字电路基础--概念、分类与基本运算

【硬件设计】数字电路基础--概念、分类与基本运算 一、数字电路基本概念二、数字电路分类(了解)三、数制四、数字电路中的二级管与三级管4.1 二级管4.2 三级管 五、逻辑运算5.1 逻辑与5.2 逻辑或5.3 非5.4 符合逻辑电路5.5 基本公式5.6 基本规则5.7 逻辑…

通过sql文件快速生成数据库设计文档

1.如果是springboot的java项目直接引入包即可&#xff0c;其他情况可以创建一个java项目然后引入包。 <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependenc…

什么是小红书内容种草,品牌内容营销分析

依托于现在各种社交类平台的崛起&#xff0c;如红薯、d音、头条等&#xff0c;越来越多精彩的内容浮现出来。那么在现今时代下&#xff0c;什么是小红书内容种草&#xff0c;品牌内容营销分析&#xff01; 一、什么是小红书内容种草 1、内容种草的核心是内容 所谓的种草&#x…

SpringBoot第8讲:SpringBoot添加Logback日志

SpringBoot第8讲&#xff1a;SpringBoot添加Logback日志 本文是SpringBoot第8讲&#xff0c;对SpringBoot添加Logback日志。SpringBoot开发中如何选用日志框架呢&#xff1f; 出于性能等原因&#xff0c;Logback 目前是springboot应用日志的标配&#xff1b; 当然有时候在生产环…

身份证真伪一键验证API接口 - 通过OCR技术快速识别和验证身份证信息

身份证是我们日常生活中必不可少的证件&#xff0c;但是在实际使用中&#xff0c;我们也会遇到很多问题&#xff0c;例如身份证是否真实有效&#xff0c;身份证信息是否准确等等。这时候我们就需要用到一种能够快速识别和验证身份证信息的技术——OCR&#xff08;Optical Chara…

python怎么实现tcp和udp连接

目录 什么是tcp连接 什么是udp连接 python怎么实现tcp和udp连接 什么是tcp连接 TCP&#xff08;Transmission Control Protocol&#xff09;连接是一种网络连接&#xff0c;它提供了可靠的、面向连接的数据传输服务。 在TCP连接中&#xff0c;通信的两端&#xff08;客户端和…

学习笔记|大模型优质Prompt开发与应用课(二)|第二节:超高产文本生成机,传媒营销人必备神器

文章目录 01 文字写作技能的革新&#xff0c;各行各业新机遇四大类常见文字工作新闻记者的一天新闻记者的一天–写策划prompt 新闻记者的一天–排采访prompt生成结果prompt生成结果 大模型加持&#xff0c;文字写作我们如何提效营销创作营销创作-使用预置法为不同平台生成文案p…

【机器学习】机器学习中的“本体”概念

一、说明 在机器学习中&#xff0c;本体越来越多地用于提供基于相似性分析和场景知识的 ML 模型。 在传统的基于标签的定义中&#xff0c;对象往往是孤立的&#xff0c;可扩展性差&#xff0c;存在重复的可能性&#xff0c;对象之间的关系无法体现。在基于本体的定义中&#xf…

​语言模型输出端共享Embedding的重新探索

©PaperWeekly 原创 作者 | 苏剑林 单位 | 科学空间 研究方向 | NLP、神经网络 预训练刚兴起时&#xff0c;在语言模型的输出端重用 Embedding 权重是很常见的操作&#xff0c;比如 BERT、第一版的 T5、早期的 GPT&#xff0c;都使用了这个操作&#xff0c;这是因为当模型…

每天一个电商API分享:获取淘宝商品sku接口

SKU通俗来讲就是一个产品最小的出库单位&#xff0c;比如说一款手机产品有红黑白三个颜色&#xff0c;那么一台红色手机就是一个sku。那么多销售属性的产品&#xff0c;再往下分&#xff0c;比如说一件T恤除了有颜色还有尺码&#xff0c;那么一件s码绿色体恤就是单个sku。 sku指…

数据学习教程:Linux基础教程(下)

本文继上一篇《Linux基础教程&#xff08;上&#xff09;》的下一篇&#xff0c;欢迎收藏。 4 Linux常用基础命令 Linux刚面世时并没有图形界面, 所有的操作全靠命令完成, 如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等 在职场中&#xff0c;大量的服务器维护工作…

C盘满了怎么清理?最全c盘清理攻略!

“c盘怎么会那么容易满啊&#xff1f;而且每次清理好像也释放不了多少空间。谁懂啊&#xff1f;一天要清理好几次c盘&#xff01;真的很麻烦。有谁能告诉我应该怎么做吗&#xff01;” 电脑c盘对我们来说真的是很重要。当我们在电脑上安装软件、存储文件或者浏览网站&#xff0…

提升打印品质:解决Excel表格乱套问题的实用技巧

作为办公人员&#xff0c;我们经常需要打印大量的数据表格。然而&#xff0c;打印表格并不是一件简单的事情&#xff0c;如果不注意&#xff0c;打印效果可能会变得混乱不堪。那么该怎么办呢&#xff1f;在这里&#xff0c;我将为大家分享9个关于Excel表格打印的技巧&#xff0…