六、代理模式

news/2025/3/16 6:01:34/

文章目录

  • 一、代理模式
    • 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();}
        }
        
      • 执行结果

        在这里插入图片描述


http://www.ppmy.cn/news/986281.html

相关文章

树和二叉树 --- 数据结构

目录 1.树的概念及结构 1.1树的概念 1.2树的表示 1.3树在实际生活中的运用 2.二叉树的概念及结构 2.1概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的存储结构 1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n (n>0)个有限结点组成…

python小记-临时变量

临时变量是在程序执行过程中用于暂时存储数据或中间结果的变量。它们在计算过程中具有临时性,一般不会长期保留数据,而是在需要的时候使用,完成特定的计算或操作后就会被释放。 临时变量的作用包括但不限于以下几个方面: 存储中间…

AI 绘画Stable Diffusion 研究(一)sd整合包v4.2 版本安装说明

部署包作者:秋葉aaaki 免责声明: 本安装包及启动器免费提供 无任何盈利目的 大家好,我是风雨无阻。众所周知,StableDiffusion 是非常强大的AI绘图工具,需要详细了解StableDiffusion的朋友,可查看我之前的这篇文章: 最…

Redis - 三大缓存问题(穿透、击穿、雪崩)

缓存穿透 概念: 查询一个数据库中也不存在的数据,数据库查询不到数据也就不会写入缓存,就会导致一直查询数据库 解决方法: 1. 缓存空数据 如果数据库也查询不到,就把空结果进行缓存 缺点是 - 消耗内存 2. 使用布…

JavaScript入门基础

文章和代码已经归档至【Github仓库:https://github.com/timerring/front-end-tutorial 】或者公众号【AIShareLab】回复 javascript 也可获取。 文章目录 JavaScript 简介JavaScript 的作用浏览器执行 JavaScript 简介JS 的组成ECMAScriptDOMBOM JS 的书写位置行内式…

STC12C5A系列单片机内部 EEPROM 的应用

参考范例程序。 eeprom.c #include "eeprom.h"/*---------------------------- Disable ISP/IAP/EEPROM function Make MCU in a safe state ----------------------------*/ void IapIdle() {IAP_CONTR 0; //Close IAP functionIAP_CMD 0; …

解析C语言实现排序的算法(冒泡排序、插入排序、选择排序、快速排序、归并排序)

本博客主要围绕五种常见的排序算法展开讨论,包括选择排序、快速排序、归并排序、冒泡排序和插入排序。针对每种算法,我对其思想、特点、时间复杂度、稳定性以及优缺点进行了详细解释和比较。 文章目录 1.冒泡排序1.1 算法思想:1.2 代码实现:1.3 解析代码…

SQL组内拼接group_concat

力扣刷题:1484. 按日期分组销售产品 表 Activities: ---------------------- | 列名 | 类型 | ---------------------- | sell_date | date | | product | varchar | ---------------------- 这个表可能包含重复数据(换…