• 代理模式(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
  • 相关阅读:
    Spring中获取bean的方式
    python+人脸识别+opencv实现真实人脸驱动的阿凡达(上)
    如何使用Java反射机制获取类的所有构造函数呢?
    基于flowable的upp(统一流程平台)运行性能优化
    cmake下的abiFilters和ndk下的abiFilters的区别
    vue3输入单号和张数,自动生成连号的单号
    全连接神经网络学习MNIST实现手写数字识别
    React 中的延迟加载Lazy loading
    基于selenium和autoit 实现B站视频自动上传功能
    linux下python连接oracle数据库
  • 原文地址:https://blog.csdn.net/weixin_52797128/article/details/126128432