Android设计模式之代理模式

news2025/4/2 2:01:05

一、定义:

        为其他对象提供一种代理以控制对这个对象的访问。

二、角色组成:

        Subject抽象主题:声明真是主题与代理的共同接口方法,可以是一个抽象类或接口。

        RealSubject真实主题:定义了代理表示的真实对象,执行具体的逻辑和方法。

        ProxySubject代理:持有对真实主题的引用,实现接口方法中调用真实主题对应的接口方法。

        Client客户:使用代理的示例,通过调用代理的方法来实现对真实主题的调用。

三、代理类型:

        1.静态代理:手动创建代理类直接持有目标对象的引用。

        2.动态代理:运行时动态生成代理类,如JDK的动态代理,CGLIB等。

        3.远程代理:跨进程通信的代理,如Android的AIDL机制。

四、简单实现:

静态代理

        1.抽象主题

public interface FileLoader {
    String readFile(String path);
}
        2.真实主题

public class RealFileLoader implements FileLoader {
    @Override
    public String readFile(String path) {
        // 模拟读取文件内容
        return "File content: " + path;
    }
}
        3.代理

public class FileLoaderProxy implements FileLoader {
    private RealFileLoader realFileLoader;
    private boolean hasPermission;

    public FileLoaderProxy(boolean hasPermission) {
        this.hasPermission = hasPermission;
    }

    @Override
    public String readFile(String path) {
        // 延迟初始化真实对象
        if (realFileLoader == null) {
            realFileLoader = new RealFileLoader();
        }

        // 权限校验
        if (!hasPermission) {
            return "Error: Permission denied!";
        }

        // 调用真实对象方法
        return realFileLoader.readFile(path);
    }
}
        4.客户端调用

public class Main {
    public static void main(String[] args) {
        // 有权限的用户
        FileLoader proxy1 = new FileLoaderProxy(true);
        System.out.println(proxy1.readFile("/data/test.txt")); 
        // 输出:File content: /data/test.txt

        // 无权限的用户
        FileLoader proxy2 = new FileLoaderProxy(false);
        System.out.println(proxy2.readFile("/data/secret.txt")); 
        // 输出:Error: Permission denied!
    }
}


动态代理

        1.抽象主题

public interface DataService {
    void saveData(String data);
    void deleteData(String id);
}
        2.真实主题

public class RealDataService implements DataService {
    @Override
    public void saveData(String data) {
        System.out.println("Saving data: " + data);
    }

    @Override
    public void deleteData(String id) {
        System.out.println("Deleting data with ID: " + id);
    }
}
        3.动态代理执行

public class LoggingHandler implements InvocationHandler {
    private Object target; // 目标对象

    public LoggingHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 记录调用日志
        System.out.println("Method called: " + method.getName());
        if (args != null) {
            System.out.println("Arguments: " + Arrays.toString(args));
        }

        // 调用真实对象方法
        Object result = method.invoke(target, args);

        // 记录返回结果
        System.out.println("Method completed: " + method.getName());
        return result;
    }
}
        4.生成动态代理调用

public class Main {
    public static void main(String[] args) {
        // 创建真实对象
        DataService realService = new RealDataService();

        // 创建动态代理
        DataService proxy = (DataService) Proxy.newProxyInstance(
            realService.getClass().getClassLoader(),
            realService.getClass().getInterfaces(),
            new LoggingHandler(realService)
        );

        // 通过代理调用方法
        proxy.saveData("Hello, Proxy!");
        proxy.deleteData("123");
    }
}


五、优缺点

优点:

        1.控制对象访问,增强安全性。

        2.支持延迟加载,优化性能。

        3.解耦客户端与目标对象

缺点:

        1.增加代码复杂度,需要额外增加代理类。

        2.动态代理可能降低运行效率。

        3.远程代理需要处理网络或跨进程问题。

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

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

相关文章

3.29:数据结构-绪论线性表-上

一、时间复杂度 1、ADT 2、定义法计算时间复杂度:统计核心语句的总执行次数 (1)例题1,与2022年的真题对比着写 此题关键在于求和公式的转化,类型为:线性循环嵌套非线性循环 2022年那道题如果考场上实在脑…

大模型架构记录13【hr agent】

一 Function calling 函数调用 from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())from openai import OpenAI import jsonclient OpenAI()# Example dummy function hard coded to return the same weather # In production, this could be your back…

conda 清除 tarballs 减少磁盘占用 、 conda rename 重命名环境、conda create -n qwen --clone 当前环境

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 conda clean --tarballsconda rename 重命名环境conda create -n qwen --clone …

pycharm相对路径引用方法

用于打字不方便,以下直接手写放图,直观理解

新能源智慧灯杆的智能照明系统如何实现节能?

叁仟新能源智慧灯杆的智能照明系统可通过以下多种方式实现节能: 智能调光控制 光传感器技术:在灯杆上安装光传感器,实时监测周围环境的光照强度。当环境光线充足时,如白天或有其他强光源时,智能照明系统会自动降低路…

Jenkins教程(自动化部署)

Jenkins教程(自动化部署) 1. Jenkins是什么? Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行&…

行业智能体大爆发,分布式智能云有解

Manus的一夜爆红,在全球范围内引爆关于AI智能体的讨论。 与过去一般的AI助手不同,智能体(AI Agent)并非只是被动响应,而是主动感知、决策并执行的应用。Gartner预测,到2028年,15%的日常工作决策…

日语Learn,英语再认识(5)

This is a dedicated function — it exists solely to solve this case. This is a dedicated function. It’s a dedicated method for solving this case. 其他备选词(但没dedicated精准): special → 含糊,有时只是“特别”…

【区块链安全 | 第十四篇】类型之值类型(一)

文章目录 值类型布尔值整数运算符取模运算指数运算 定点数地址(Address)类型转换地址的成员balance 和 transfersendcall,delegatecall 和 staticcallcode 和 codehash 合约类型(Contract Types)固定大小字节数组&…

音视频入门基础:MPEG2-TS专题(25)——通过FFmpeg命令使用UDP发送TS流

一、通过FFmpeg命令使用UDP发送TS流 通过以下FFmpeg命令可以将一个mp4文件转换为ts封装,并基于UDP发送(推流): ffmpeg.exe -re -i input.mp4 -vcodec copy -acodec copy -f mpegts udp://127.0.0.1:1234 其中: “in…

Error in torch with streamlit

报错信息: This is the error which is a conflict between torch and streamlit: Examining the path of torch.classes raised: Tried to instantiate class path.path’, but it does not exist! Ensure that it is registered via torch::class Steps to reproduce: py…

网络基础知识介绍

目录 一、计算机网络背景与发展 1.1 计算机网络的背景 ​编辑1.2 计算机网络的发展历程 二、网络协议 2.1 认识网络协议 2.3 协议分层 2.4 OSI七层模型 2.5 TCP/IP 五层(或四层)模型 三、网络传输基本流程 3.1 网络传输流…

MIPS-32架构(寄存器堆,指令系统,运算器)

文章目录 0 Preview:寄存器32通用0 $zero1 $at2—3 \$v0-$v14—7 \$a0-$a38—15 \$t0-$t716—23 \$s0-$s724—25 \$t8-$t926—27 \$k0-$k128 $gp29 $sp30 $fp 指令系统运算存储器 0 Preview: MIPS架构有32位版本和64位版本,本文介绍32位版本 寄存器 正如笔者曾说…

【什么是机器学习——多项式逼近】

什么是机器学习——多项式逼近 机器学习可以分成三大类别,监督学习、非监督学习、强化学习。三大类别背后的数学原理不同。监督学习使用了数学分析中的函数逼近方法和概率统计中的极大似然方法;非监督学习使用聚类和EM算法;强化学习使用马尔可夫决策过程的想法。 机器学习的…

《午夜地铁的幽灵AP》

点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 文章目录 **第一章:末班车的二进制月光****第二章:ESP32的赛博墓志铭****第三章:都市传说与CRC校验****第四章:数字孪生的献祭仪式****终章…

创作领域“<em >彩</em><em>票</em><em>导</em><em>师</em><em>带</em><em>玩</em><em>群

天光揉碎最后一块夜斑,露珠压弯草叶的脆响惊醒了沉睡的巷子。青灰雾霭中,老墙上的爬山虎在打哈欠,卷曲的藤须滴落隔夜的月光。sFsTU

Spring Cloud Gateway中GatewayFilter Factories(网关过滤工厂)的详细介绍

文章目录 1、网关过滤工厂介绍2、 GatewayFilter 过滤器的基本配置3、 Spring Cloud Gateway 内置 GatewayFilter Factories3.1、AddRequestHeader GatewayFilter3.2、AddResponseHeader GatewayFilter3.3、AddRequestParameter GatewayFilter3.4、RewritePath GatewayFilter3.…

微服务架构:构建可持续演进的微服务架构的原则与实践指南

引言:微服务的价值锚点 某物流公司微服务化后,订单履约周期从2小时缩短至15分钟,但技术债务却以每年200%的速度增长。这个案例揭示了一个关键认知:‌微服务架构的成败不在于技术实现,而在于是否建立有效的演进机制‌。…

C++的四种类型转换

文章目录 const_cast:去掉常量类型的类型转换static_cast:提供编译器认为安全的类型转换&#xff08;在编译阶段完成类型转换&#xff09;reinterpret:类似c风格的强制类型转化dynamic_cast:主要用在继承结构里&#xff0c;可以支持RTTI类型识别的上下转换dynamic_cast<>…

《Python实战进阶》No37: 强化学习入门加餐版3 之 Q-Learning算法可视化升级

连续第4篇文章写Q-Learning算法及可视化 Q-Learning强化学习算法在迷宫寻路中的应用 引言 强化学习是机器学习的一个重要分支&#xff0c;其核心理念是通过与环境的交互来学习最优策略。在上三篇文章中&#xff0c;《Python实战进阶》No37: 强化学习入门&#xff1a;Q-Learn…