六、代理模式

文章目录

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

        在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ | 哈希表的实现与unordered_set/unordered_map的封装

目录 前言 一、哈希 1、哈希的概念 2、哈希函数 (1)直接定址法 (2)除留余数法 (3)平方取中法(了解) (4)随机数法(了解) 3、哈…

Nginx解决文件服务器文件名显示不全的问题

Nginx可以搭建Http文件服务器,但默认的搭建会长文件名显示不全,比如如下: 问题:显示不全,出现...,需要进行解决 这里使用重新编绎nginx的方式,见此文: https://unix.stackexchange…

刷题笔记 day4

力扣 611 有效三角形的个数 首先需要知道如何判断 三个数是否能构成三角形。 假如 存在三个数 a < b < c&#xff0c;如果要构成三角形&#xff0c;需要满足&#xff1a; ab > c ; a c > b ; b c > a ; 任意两个数大于第三个数就可构成三角形。 其实不难…

网络编程 IO多路复用 [select版] (TCP网络聊天室)

//head.h 头文件 //TcpGrpSer.c 服务器端 //TcpGrpUsr.c 客户端 select函数 功能&#xff1a;阻塞函数&#xff0c;让内核去监测集合中的文件描述符是否准备就绪&#xff0c;若准备就绪则解除阻塞。 原型&#xff1a; #include <sys/select.…

Codeforces Round 889 (Div. 2)(视频讲解A——D)

文章目录 A Dalton the TeacherB Longest Divisors IntervalC2 Dual (hard Version)D Earn or Unlock Codeforces Round 889 (Div. 2)&#xff08;视频讲解A——D&#xff09; A Dalton the Teacher #include<bits/stdc.h> #define endl \n #define INF 0x3f3f3f3f us…

设计模式大白话——装饰者模式

装饰者模式 文章目录 装饰者模式一、概述二、应用场景三、代码示例四、小结 一、概述 ​ 装饰者模式&#xff0c;此模式最核心之处在于装饰二字&#xff0c;之所以需要装饰&#xff0c;是因为基础的功能无法满足需求&#xff0c;并且装饰是临时的&#xff0c;并不是永久的&…

idea调节文字大小、日志颜色、git改动信息

idea调节菜单栏文字大小&#xff1a; 调节代码文字大小&#xff1a; 按住ctrl滚动滑轮可以调节代码文字大小&#xff1a; 单击文件即可在主窗口上打开显示&#xff1a; idea在控制台对不同级别的日志打印不同颜色 &#xff1a; “grep console”插件 点击某一行的时候&#x…

二叉树(C语言)

文章目录 1.树1.1概念1.2相关定义1.3 表示&#xff08;左孩子右兄弟&#xff09; 2.二叉树2.1概念2.2特殊的二叉树1. 满二叉树&#xff1a;2. 完全二叉树&#xff1a; 2.3二叉树的性质2.4练习 3.二叉树的存储结构1. 顺序存储2. 链式存储 4.完全二叉树的代码实现4.1堆的介绍1.堆…

Java+SpringBoot+Mybaties-plus+Vue+ElementUI 基于协同过滤算法商品推荐系统

一.项目介绍 协同过滤算法商品推荐系统分为两类角色 普通用户以及超级管理员 普通用户&#xff1a; 查看推荐商品、加入购物车、收藏、评论、个人中心、查看订单状态、编辑收货地址 超级管理员&#xff1a; 维护个人信息、维护用户管理、维护商品类型管…

解决构建maven工程时,配置了阿里云的前提下,依旧使用中央仓库下载依赖导致失败的问题!!!

问题描述&#xff1a; 在使用spring进行构建项目时&#xff0c;出现下载依赖迟迟不成功&#xff0c;显示maven wrapper 下载失败的问题。 Maven wrapper Cannot download ZIP distribution from https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/ap…

【Linux命令200例】patch 用于将补丁文件应用到源码中

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜…

如何用python画一朵花,用python画彩色六边形

大家好&#xff0c;小编为大家解答用python画彩色六边形的问题。很多人还不知道如何用python画一朵花&#xff0c;现在让我们一起来看看吧&#xff01;

linux 学成之路(基础篇)(二十三)MySQL服务(下)

目录 一、用户权限管理概述 二、用户权限类型 三、用户赋予权限 四、删除权限 五、删除用户 一、用户权限管理概述 数据库用户权限管理是数据库系统中非常重要的一个方面&#xff0c;它用于控制不同用户访问和操作数据库的权限范围。数据库用户权限管理可以保护敏感数据和…

【phaser微信抖音小游戏开发004】往画布上增加文本以及文本的操作

我们在states中创建st004.js的类&#xff0c;或者将states中的index.js直接重命名为st004.js&#xff0c;把里面的类名也修改为st004.如下图 在main.js中&#xff0c;引入st004,并设置启用的state为st004。如下图 接下来到states/st004里面&#xff0c;在create里面将文本修改一…

Rust ESP32C3开发

Rust ESP32C3开发 系统开发逐步使用Rust语言&#xff0c;在嵌入式领域Rust也逐步完善&#xff0c;本着学习Rust和ESP32的目的&#xff0c;搭建了ESP32C3的环境&#xff0c;过程中遇到了不少问题&#xff0c;予以记录。 ESP-IDF开发ESP32 这一部分可跳过&#xff0c;是使用C开…

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列预测(多指标,多图)

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列预测(多指标,多图) 目录 时序预测 | MATLAB实现GRNN广义回归神经网络时间序列预测(多指标,多图)效果一览基本介绍程序设计参考资料效果一览 基本介绍 1.MATLAB实现GRNN广义回归神经网络时间序列预测(完整源码和数据) …

万界星空/推出生产制造执行MES系统/开源MES/免费下载

免费MES系统介绍 什么是MES系统呢&#xff1f;MES系统主要功能就是解决“如何生产”的问题。通过实施MES系统&#xff0c;一站式解决您所困扰的所有生产制作流程问题。 普通的免费MES系统只提供简单的基本功能让客户体验&#xff0c;而万界星空MES系统运用低代码的形式开发&a…

【Python】Web学习笔记_flask(2)——getpost

flask提供的request请求对象可以实现获取url或表单中的字段值 GET请求 从URL中获取name、age两个参数 from flask import Flask,url_for,redirect,requestappFlask(__name__)app.route(/) def index():namerequest.args.get(name)agerequest.args.get(age)messagef姓名:{nam…

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境4

7、使用串口工具 &#xff08;1&#xff09;连接硬件 连接 Type C 线&#xff0c; 一端电脑一端开发板 查看设备是否已经正确识别&#xff1a; 在 Windows 下可以打开设备管理器来查看 如果没有发现设备&#xff0c; 需要确认有没有装驱动以及接触是否良好 &#xff08;2&a…

C++设计模式之访问者模式

C访问者设计模式 文章目录 C访问者设计模式什么是设计模式什么是访问者设计模式该模式有什么优缺点优点缺点 如何使用 什么是设计模式 设计模式是一种通用的解决方案&#xff0c;用于解决特定的一类问题。它是一种经过验证的代码组织方式&#xff0c;可以帮助开发人员更快地实…