码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 代理模式(Proxy Pattern) - 静态代理


    代理模式

    代理模式: 为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象

    好处是:可以在目标对象的基础上,增强额外的功能操作,即扩展目标对象的功能
    被代理对象: 可以是远程对象、创建开销大的对象或者需要安全控制的对象

    分为:

    1. 静态代理
    2. 动态代理
      • JDK动态代理:需要被代理对象实现接口
      • Cglib动态代理:不需要被代理对象实现接口

    代理模式示意图:
    在这里插入图片描述

    静态代理

    静态代理在程序运行前就已经存在代理类的字节码文件。在使用时,需要定义接口或者父类,被代理对象(及目标对象)与代理对象一起实现相同的接口或者继承相同的父类
    应用实例:

    • 定义一个老师的接口:ITeacher
    • 目标对象(被代理对象) LiTeacher 实现接口 ITeacher
    • 代理类 TeacherProxy,也需要实现接口ITeacher,同时聚合一个ITeacher类型的属性
    • 调用时通过调用代理类TeacherProxy的方法来调用目标对象

    **优点:**在不修改目标对象的功能前提下,能通过代理对象对目标功能扩展
    **缺点:**一个目标类会有一个代理类,所以会有很多代理类产生,一旦接口增加方法,目标对象与代理对象都需要维护

    UML类图:

    在这里插入图片描述

    代码示例:

    //接口
    public interface ITeacher {
    
    	void teach();
    }
    
    // 目标类(被代理类)
    public class LiTeacher implements ITeacher{
    	
    	public void teach(){
    		System.out.println("正在讲课...");
    	}
    }
    
    // 代理类
    public class ProxyTeacher implements ITeacher{
    
    	// 通过接口聚合 被代理类
    	private ITeacher target;
    	
    	public ProxyTeacher(ITeacher target) {
    		this.target = target;
    	}
    	
    	@Override
    	public void teach() {
    		// 额外操作1
    		System.out.println("代理开始...");
    		target.teach();
    		// 额外操作2
    		System.out.println("代理结束...");
    		
    	}
    
    }
    
    // 测试类
    public class Main {
    	public static void main(String[] args) {
    		// 创建目标对象(被代理对象)
    		LiTeacher liTeacher = new LiTeacher();
    		
    		// 创建代理对象,同时传入目标对象
    		ProxyTeacher proxy = new ProxyTeacher(liTeacher);
    		
    		proxy.teach();
    		
    	}
    }
    
    // 结果显示
    ------------------------------------------------------
        代理开始...
        正在讲课...
        代理结束...
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
  • 相关阅读:
    SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.23 SpringBoot 整合 RabbitMQ(direct 模式)
    【活动报名】11月19日 | AI GC 的技术与应用构建
    Unity——利用Mesh绘制图形
    [附源码]java毕业设计哈金院食堂美食评价系统
    【机器学习】7 ——k近邻算法
    基于PHP的创意设计分享系统设计与实现(源码+lw+部署文档+讲解等)
    【LeetCode每日一题合集】2023.10.9-2023.10.15(贪心&⭐位运算的应用:只出现一次的数字)
    [C++]C++类和对象(下)、
    【通信工程笔记】【终端与业务-第十二章】市场营销计划、实施和控制
    在docker中删除none镜像
  • 原文地址:https://blog.csdn.net/weixin_52797128/article/details/126128432
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号