java回顾总结--代理模式

目录

  • 一、代理模式
    • 1.1 静态代理
      • 示例
    • 1.2 动态代理
      • 示例
  • 二、总结


一、代理模式

1.1 静态代理

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。比如你按照小卡片上的电话打过去寻求服务,一般不是由本人,可能是一个成年雄性接听电话,然而真正做事情的可能是另一个小姐姐。
目的:

  • (1)通过引入代理对象的方式来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性
  • (2)通过代理对象对访问进行控制;

代理模式一般会有三个角色:

  • 抽象角色:

指代理角色和真实角色对外提供的公共方法,一般为一个接口

  • 代理角色:

需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。将统一的流程控制都放到代理角色中处理

  • 真实角色(被代理角色):

需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用。也就是真正的业务逻辑在此。

静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。一般来说,被代理对象和代理对象是一对一的关系,当然一个代理对象对应多个被代理对象也是可以的。

  • 一对一情况下:
    静态代理对象数量多:在一对一的情况下,如果每个接口或类都需要一个对应的代理类,那么随着业务逻辑的增加,代理对象的数量也会随之增加。这样会导致代码量大,因为每个接口或类都需要一个对应的代理类,从而增加了代码的复杂性。
    代码量大、可维护性差:由于静态代理需要为每个被代理对象创建一个代理对象,当业务逻辑变得复杂时,代理对象的数量会快速增加,导`致代码量庞大。这样会使得代码难以维护,因为每个代理对象都需要单独管理,增加了代码的复杂性和维护成本。
  • 一对多情况下:
    代理对象扩展能力差:在一对多的情况下,如果需要为多个接口或类创建统一的代理对象,这样可能会导致代理对象的扩展能力较差。因为代理对象需要同时处理多个接口或类的请求,如果后续需要对某个接口或类的代理逻辑进行修改或扩展,可能会影响到其他接口或类的代理逻辑。

为了解决上述问题,可以考虑使用动态代理模式来代替静态代理。动态代理可以减少代理类的数量,提高代码的复用性和可维护性。

示例

/*** 代理抽象角色: 定义了服务的接口*/
public interface Massage {void massage();
}/*** 足浴*/
public interface Wash {void wash();
}/***  实现类: 提供服务的proxy1*/
public class proxy1 implements Massage, Wash {@Overridepublic void massage() {System.out.println("精通各种按摩手法");}@Overridepublic void wash() {}
}/*** 实现类: 提供服务的proxy2*/
public class proxy2 implements Massage {@Overridepublic void massage() {System.out.println("36D,手法一流");}
}
/*** 代理对象:经纪人*/
public class Agent implements Massage {private final Massage massage;public Agent(Massage massage) {this.massage = massage;}//....前置处理public void before() {System.out.println("一条龙服务,包君满意");}//....后置处理public void after() {System.out.println("满意度调查");}@Overridepublic void massage() {before();massage.massage();after();}
}public class MyClass {public static void main(String[] args){//静态代理Massage message = new proxy2();Agent agent = new Agent(message);agent.massage();}
}

输出:
在这里插入图片描述


1.2 动态代理

在运行时再创建代理类和其实例,因此显然效率更低。要完成这个场景,需要在运行期动态创建一个Class。JDK提供了 Proxy 来完成这件事情。实际上, Proxy.newProxyInstance 会创建一个Class,与静态代理不同,这个Class不是由具体的.java源文件编译而来,即没有真正的文件,只是在内存中按照Class格式生成了一个Class。

示例

/*** 足浴*/
public interface Wash {void wash();
}
/*** 代理抽象角色: 定义了服务的接口*/
public interface Massage {void massage();
}public class proxy1 implements Massage, Wash {@Overridepublic void massage() {System.out.println("精通各种按摩手法");}@Overridepublic void wash() {System.out.println("精通各种洗脚手法");}
}public class proxy2 implements Massage {@Overridepublic void massage() {System.out.println("36D,手法一流");}
}public class MyClass {public static void main(String[] args) throws Exception {        //动态代理proxy1 proxy1 = new proxy1();Object o = Proxy.newProxyInstance(MyClass.class.getClassLoader(),new Class[]{Massage.class,Wash.class}, new InvocationHandler() {@Overridepublic Object invoke(Object o, Method method, Object[] objects) throws Throwable {//System.out.println(o.toString());  //会报栈溢出return method.invoke(proxy1,objects);}});Massage massage = (Massage) o;massage.massage();Wash wash = (Wash) o;wash.wash();}
}

输出:
在这里插入图片描述


二、总结

静态代理在一对一情况下可能会导致代码量大、可维护性差,而在一对多情况下可能会出现代理对象扩展能力差的问题。为了解决这些问题,可以考虑使用动态代理以及其他设计模式来提高代码的灵活性和可维护性。

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

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

相关文章

C# 学习第四弹——字符串

一、char类型的使用 字符使用单引号,单个字符 转义字符是一种特殊的字符变量,以反斜线开头,后跟一个或多个字符。 输出多级目录可以使用 二、字符串的声明和初始化 1、引用字符串常量 引用字符串常量初始化——字符使用单引号&#xff0…

加密与安全_探索常用编码算法

文章目录 概述什么是编码编码分类ASCII码 (最多只能有128个字符)Unicode (用于表示世界上几乎所有的文字和符号)URL编码 (解决服务器只能识别ASCII字符的问题)实现:编码_URLEncoder实现&#xf…

K8S常用kubectl命令汇总(持续更新中)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【Prometheus】基于Altertmanager发送告警到多个接收方、监控各种服务、pushgateway

基于Altertmanager发送报警到多个接收方 一、配置alertmanager-发送告警到qq邮箱1.1、告警流程1.2、告警设置【1】邮箱配置【2】告警规则配置【3】 部署prometheus【4】部署service 二、配置alertmanager-发送告警到钉钉三、配置alertmanager-发送告警到企业微信3.1、注册企业微…

量子算法入门—4.量子比特与量子门(1)

1.量子比特 经典比特和量子比特 经典比特只有0、1两种取值,非黑即白,有n位即 2 n 2^n 2n种可能量子比特使用0、1的量子态描述量子比特的状态,可以通过线性组合形成新的量子态,就像光谱可以调节成分 引入线代记法,0、…

ARK:《BIG IDEAS 2024》

Cathie Wood所带领的方舟投资(ARK)发布了年度重磅研究报告《BIG IDEAS 2024》,该报告指出人工智能、公共区块链、多组学测序、能源存储和机器人技术这五大板块的融合将带来全球经济活动的改变。 这五个创新平台正在融合并定义这个技术时代&am…

92. 递归实现指数型枚举 刷题笔记

思路 dfs 考虑选或者不选每个位置 用0表示未考虑 1表示选 2表示不选 用u表示搜索状态 u>n时 已经搜到底层了 需要输出当前方案 遍历 如果选了则输出 #include<iostream> using namespace std; int n; const int N16; int st[N]; void dfs(int u){ //u来记…

Git自动忽略dll文件的问题

检查了半天发现是sourcetreee的全局忽略文件导致&#xff0c; 从里面删除dll即可。 我是干脆直接删了全局忽略&#xff0c;太恶心了&#xff0c;如下&#xff1a; #ignore thumbnails created by windows Thumbs.db #Ignore files build by Visual Studio *.exe .vsconfig .s…

fastAdmin表格列表的功能

更多文章&#xff0c;请关注&#xff1a;fastAdmin后台功能详解 | 夜空中最亮的星 FastAdmin是一款基于ThinkPHP5Bootstrap的极速后台开发框架。优点见开发文档 介绍 - FastAdmin框架文档 - FastAdmin开发文档 在这里上传几张优秀的快速入门图: 一张图解析FastAdmin中的表格列…

Linux网络编程(四-TCP协议)

目录 一、TCP概念 二、TCP的首部格式 三、TCP可靠传输机制 3.1 确认应答机制 3.2 超时重传机制 3.3 连接管理 3.3.1 三次握手 3.3.2 四次挥手 3.4 流量控制 3.5 拥塞控制 四、TCP效率机制 4.1 滑动窗口 4.2 重发控制 4.3 延迟应答 4.4 捎带应答 五、TCP的…

大数据分布式计算工具Spark实战讲解(数据输入实战)

Python数据容器转RDD对象 PySpark支持通过SparkContext对象的parallelize成员方法&#xff0c;将&#xff1a; - list - tuple - set - dict - str 转换为PySpark的RDD对象 注意&#xff1a; •字符串会被拆分出1个个的字符&#xff0c;存入RDD对象 •字典仅有key会被存入…

Open Harmony开发之分布式账本

简介 Demo基于Open Harmony系统使用ETS语言进行编写&#xff0c;本Demo主要通过设备认证、分布式拉起、分布式数据管理等功能来实现。 应用效果 设备认证,获取同一个局域网内的设备ID&#xff0c;并拉起应用 添加数据并在另一台设备显示该数据 开发步骤 1.新建Openharmony…

安卓使用okhttpfinal下载文件,附带线程池下载使用

1.导入okhttp包 implementation cn.finalteam:okhttpfinal:2.0.7 2.单个下载 package com.example.downloading;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.util.Log; import android.view.View;import java.io.File;import c…

大数据分布式计算工具Spark数据计算实战讲解(map方法,flatmap方法,reducebykey方法)

数据计算 map方法 PySpark的数据计算&#xff0c;都是基于RDD对象来进行的&#xff0c;那么如何进行呢&#xff1f; 自然是依赖&#xff0c;RDD对象内置丰富的&#xff1a;成员方法&#xff08;算子&#xff09; 功能&#xff1a;map算子&#xff0c;是将rdd的数据一条条处…

Java 小项目开发日记 01(注册接口的开发)

Java 小项目开发日记 01&#xff08;注册接口的开发&#xff09; 1.项目需求 完成注册接口 2.项目目录 3. 配置文件&#xff08;pom.xml&#xff09; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-insta…

NWatch-Alarm闹钟功能实现

文章目录 W25Q64初始化SPI初始化W25Q初始化 AlARM模块初始化AlARM模块绘制Draw函数AlARM的更新函数AlARM中最重要的函数 W25Q64初始化 W25Q64用来存储用户设置的闹钟值&#xff0c;开机的时候自动读取闹钟记录。 SPI初始化 使用CubeMx自动配置。 #define SPI1CS_ON HAL_GP…

3d模型导出简单线条的步骤---模大狮模型网

导出简单线条的3D模型通常涉及以下步骤&#xff1a; 创建线条模型&#xff1a;首先&#xff0c;在您的3D建模软件中创建或导入包含线条的模型。这可以是简单的线框模型&#xff0c;也可以是由线条构成的复杂形状。确保您的模型中只包含您希望导出的线条部分。 选择导出格式&am…

Python的自然语言处理库NLTK介绍

NLTK&#xff08;Natural Language Toolkit&#xff09;简介 NLTK是Python中一个领先的自然语言处理&#xff08;NLP&#xff09;库&#xff0c;它提供了文本处理的基础设施&#xff0c;包括分词&#xff08;tokenization&#xff09;、词性标注&#xff08;part-of-speech tag…

yolov5v7v8目标检测增加计数功能--免费源码

在yolo系列中&#xff0c;很多网友都反馈过想要在目标检测的图片上&#xff0c;显示计数功能。其实官方已经实现了这个功能&#xff0c;只不过没有把相关的参数写到图片上。所以微智启软件工作室出一篇教程&#xff0c;教大家如何把计数的参数打印到图片上。 一、yolov5目标检测…

前端Ajax获取当前外网IP地址并通过腾讯接口解析地理位置

目录 一、获取访问端IP地址 二、可用的IP获取接口 1、韩小韩IP获取接口&#xff1a; 2、ipify API 附3、失败的太平洋接口 三、腾讯位置服务-IP位置查询接口 一、获取访问端IP地址 原计划使用后端HttpServletRequest 获取访问端的IP地址&#xff0c;但在nginx和堡垒机等阻…