【设计模式-代理】

news2024/9/21 0:46:03

定义

代理模式是一种结构型设计模式,它提供了对象的替代者或占位符,用来控制对这个对象的访问。通过代理模式,一个类可以代表另一个类来执行某些操作。这种模式常用于增强对象的功能或控制对对象的访问

特点

控制访问:代理模式可以控制对目标对象的访问,甚至可以在访问前后进行某些操作。
增强功能:代理可以在不修改目标对象的前提下,增强目标对象的功能。
延迟加载:代理模式可以实现对象的延迟加载,只有在真正需要的时候才创建对象。

分类

  • 静态代理(Static Proxy):代理类在编译时已经确定,通常由开发者手动编写。
  • 动态代理(Dynamic Proxy):代理类在运行时动态生成,通常通过反射机制实现。
  • 虚拟代理(Virtual Proxy):用于延迟加载对象,只有在需要时才创建对象。
  • 保护代理(Protection Proxy):控制对对象的访问权限。
  • 远程代理(Remote Proxy):用于控制对远程对象的访

组成

在这里插入图片描述

  • 抽象主题角色:定义了被代理角色和代理角色的共同接口或者抽象类。

  • 被代理角色:实现或者继承抽象主题角色,定义实现具体业务逻辑的实现。

  • 代理角色:实现或者继承抽象主题角色,持有被代理角色的引用,控制和限制被代理角色的实现,并且拥有自己的处理方法(预处理和善后)

代码

静态代理

// 抽象接口
public interface Subject {
    void request();
}

// 真实对象,实现具体的业务逻辑
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

// 代理类,控制对 RealSubject 的访问
public class Proxy implements Subject {
    private RealSubject realSubject;

    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        System.out.println("Proxy: Performing additional actions before forwarding request to RealSubject.");
        realSubject.request();
        System.out.println("Proxy: Performing additional actions after forwarding request to RealSubject.");
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request();
    }
}

动态代理

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 真实对象,实现具体的业务逻辑
class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

// 动态代理处理器
class ProxyInvocationHandler implements InvocationHandler {
    private final Object realSubject;

    public ProxyInvocationHandler(Object realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Proxy: Performing actions before invoking real subject.");
        Object result = method.invoke(realSubject, args);
        System.out.println("Proxy: Performing actions after invoking real subject.");
        return result;
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();

        // 创建代理对象
        Subject proxyInstance = (Subject) Proxy.newProxyInstance(
            realSubject.getClass().getClassLoader(),
            realSubject.getClass().getInterfaces(),
            new ProxyInvocationHandler(realSubject)
        );

        // 调用代理对象的方法
        proxyInstance.request();
    }
}

优点

  • 职责分离:通过代理模式,可以将真实对象的实现与控制访问的逻辑分离,符合单一职责原则。
  • 增强功能:在不修改真实对象的情况下,通过代理类可以增加额外的功能,如日志记录、性能统计、安全控制等。
  • 灵活性:代理模式使得在不改变客户端代码的情况下,能够动态地更换不同的代理对象。

缺点

  • 增加复杂性:引入代理模式会增加系统的复杂性,尤其是在使用动态代理时,可能会让代码变得难以理解和调试。
  • 性能开销:代理模式在某些情况下会增加系统的开销,特别是在频繁调用的情况下,代理对象的创建和方法调用的间接性可能会影响性能。

场景

  • 远程代理:需要通过代理对象来控制对远程对象的访问。
  • 虚拟代理:需要延迟创建资源消耗大的对象,或者只在需要时创建对象。
  • 保护代理:需要控制对对象的访问权限,如在应用程序中根据用户的权限控制对某些功能的访问。
  • 缓存代理:需要对访问频繁的对象或结果进行缓存,以减少资源消耗或提高性能。

总结

代理模式通过引入代理对象控制对目标对象的访问,适用于需要增强功能、延迟加载、权限控制、远程访问等场景。静态代理通过手动编写代理类来控制对象访问,而动态代理则通过运行时生成代理类提供了更灵活的解决方案。虽然代理模式增加了系统的复杂性,但它在特定场景下能带来更好的代码结构和更高的灵活性。

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

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

相关文章

day01 1.c++对c的扩充

#include <iostream>using namespace std;int main() {string s1;cout << "请输入一个字符串&#xff1a;";getline(cin,s1);int count10,count20,count30,count40;int len s1.length();for(int i0;i<len;i){if((s1[i]>a&&s1[i]<z) ||…

BeanPostProcessor和Ordered

1. 概述 BeanPostProcessor 和 Ordered 接口用于在Spring容器初始化Bean的过程中进行自定义处理&#xff0c;并控制处理顺序 2. BeanPostProcessor BeanPostProcessor 接口允许你在Spring容器初始化Bean的前后对Bean进行自定义处理。它有两个方法&#xff1a; postProcessB…

zabbix对接Grafana

1.grafana安装 Download Grafana | Grafana Labs sudo yum install -y https://dl.grafana.com/oss/release/grafana-11.1.4-1.x86_64.rpm 2.zabbix插件安装 Grafana 默认并没有 zabbix 数据源的支持&#xff0c;只有安装了zabbix插件&#xff0c;才可以在grafana中添加zabbi…

峟思固定测斜仪的工作原理与应用

固定测斜仪作为一种精密的测量仪器&#xff0c;在地质工程、土木工程、矿山安全等领域中发挥着至关重要的作用。它通过测量土体或岩体内部的水平位移&#xff0c;为工程安全监测提供了可靠的数据支持。本文将详细介绍固定测斜仪的工作原理、结构组成以及其在实际应用中的表现。…

一文读懂 DDD领域驱动设计

DDD&#xff08;Domain-Driven Design&#xff0c;领域驱动设计&#xff09;是一种软件开发方法&#xff0c;它强调软件系统设计应该以问题领域为中心&#xff0c;而不是技术实现为主导。DDD通过一系列手段如统一语言、业务抽象、领域划分和领域建模等来控制软件复杂度&#xf…

快手小店自动回复机器人脚本

快手小店自动回复机器人是一种利用人工智能AI技术&#xff0c;能够根据用户的会话咨询内容自动回复的工具。这种机器人可以帮助快手小店主快速、高效地回复客户消息&#xff0c;提升店铺的客户服务质量和销售效率。 甜羊浏览器是一款基于Chromium内核开发的国产浏览器&#xff…

OpenAI API: How to count tokens before API request

题意&#xff1a;“OpenAI API&#xff1a;如何在 API 请求之前计算令牌数量” 问题背景&#xff1a; I would like to count the tokens of my OpenAI API request in R before sending it (version gpt-3.5-turbo). Since the OpenAI API has rate limits, this seems impor…

记录一次target引发的事故:一直提示数据库连接超时

你们好&#xff0c;我是金金金。 场景 启动项目&#xff0c;一直报数据库连接超时&#xff1a; The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. The error may exist in com/xuecheng/sy…

【分立元件】以太网变压器中心抽头有什么作用?

在以太网设备中,通过 PHY 接 RJ45 时,中间都会加一个网络变压器。 但查看不同产品的设计,有的变压器中心抽头接电源,有的又接电容到地。而且接电源时,电源值又可以不一样,3.3V,2.5V,1.8V都有。这个变压器的中心抽头作用到底是什么呢? 中心抽头作用 1. 通过提…

云渲染解决:笔记本渲染很伤电脑吗?如何保护你的电脑?

笔记本电脑是设计师、视频剪辑师和3D艺术家的重要工具&#xff0c;提供随时随地的创作能力。但渲染工作可能对笔记本造成损害。本文将分析渲染对笔记本的影响&#xff0c;并提供减少损伤的策略&#xff0c;帮助用户保持设备在创作中的高效与安全。 一、笔记本电脑渲染的影响 电…

【html+css 绚丽Loading】 000020 三才流转盘

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

xss-labs通关攻略 11-15关

第十一关&#xff1a;less-11 步骤一&#xff1a;利用burp抓包 步骤二&#xff1a;添加referer:click me!" type"button" οnmοuseοver"alert(/xss/)进行放包 第十二关&#xff1a;less-12 步骤一&#xff1a;利用burp抓包 步骤二&#xff1a;修改User A…

快团团幸运大转盘是是什么?团长如何使用?

幸运大转盘是什么&#xff1f; 1、团员可以在团内转转盘进行抽奖 2、团员获得的奖励有优惠券&#xff08;无门槛、满减&#xff09;&#xff0c;实物礼品两种形式 3、团员可通过在团内下单&#xff0c;来增加转转盘的次数 4、团长可自行设定奖品、中奖概率&#xff08;中奖…

Linux单用户模式和救援模式

Linux单用户模式和救援模式 单用户模式Initramfs模式进入救援模式 修改被救援Linux的配置挂载boot和/切根 单用户模式 Linux系统的单用户模式有些类似Windows系统的安全模式&#xff0c;只启动最少的程序用于系统修复。在单用户模式中&#xff08;运行级别为1&#xff09;&…

集团数字化转型方案(十八)

为了实现集团的数字化转型&#xff0c;我们将通过引入人工智能、大数据分析、云计算和物联网等先进技术&#xff0c;全面升级现有业务系统与流程&#xff0c;优化企业资源规划&#xff08;ERP&#xff09;&#xff0c;提升业务自动化水平和数据驱动决策能力&#xff1b;建设集成…

一个可以免费上传制作电子版招生简章的网站

当今社会&#xff0c;网络的普及使得越来越多的学校和企业选择通过电子版招生简章来扩大影响力&#xff0c;降低宣传成本。有没有一个免费、便捷且功能强大的平台&#xff0c;能让您轻松上传制作招生简章呢&#xff1f;答案是肯定的&#xff01; 1.要制作电子杂志,首先需要选择…

Mybatis Plus乐观锁实现

1 引言 乐观锁的主要作用在于提高系统的并发性能和减少锁冲突&#xff0c;同时保证数据的一致性。‌其原理简单来说就是&#xff0c;在修改数据的时候&#xff0c;判断数据是否被其他人改过&#xff0c;如果已被其他人改过&#xff0c;则修改失败。 2 代码 在SpringBoot 3.x…

掏耳勺买什么样的好?五大超值不踩雷可视挖耳勺推荐种草!

可视挖耳勺是热度特别高的个人清洁工具&#xff0c;不仅能够更加清晰地观察自己耳内的状况&#xff0c;从而更加安全、有效地清洁耳朵&#xff0c;可以发挥多种多样的作用&#xff0c;但是市面上也隐藏了很多劣质不专业产品&#xff0c;使用这类产品容易出现成像效果模糊、机身…

AI文案新纪元:用ChatGPT构建你的文案创作系统

文章目录 一、ChatGPT在文案创作中的独特优势1. 高效生成&#xff0c;快速响应市场2. 个性化定制&#xff0c;精准触达受众3. 创新表达&#xff0c;提升内容吸引力 二、构建文案创作系统的详细步骤1. 需求分析与系统规划2. 接入ChatGPT API与集成开发3. 设计用户友好的交互界面…

集合及数据结构第十三节(下)———— 枚举与Lambda表达式

系列文章目录 集合及数据结构第十三节&#xff08;下&#xff09;———— 枚举与Lambda表达式 枚举与枚举的使用 什么是C语言数据类型变量、常量字符串转义字符注释选择语句循环语句函数数组操作符常见关键字define 定义常量和宏指针结构体 文章目录 系列文章目录集合及数据…