Android设计模式之代理模式

一、定义:

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

二、角色组成:

        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.mzph.cn/web/74003.shtml

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

相关文章

国外计算机证书推荐(考证)(6 Sigma、AWS、APICS、IIA、Microsoft、Oracle、PMI、Red Hat)

文章目录 证书推荐1. 六西格玛 (6 Sigma)2. 亚马逊网络服务 (AWS)3. 美国生产与库存控制学会 (APICS)4. 内部审计师协会 (IIA)5. 微软 (Microsoft)6. 甲骨文 (Oracle)7. 项目管理协会 (PMI)8. 红帽 (Red Hat) 证书推荐 1. 六西格玛 (6 Sigma) 介绍:六西格玛是一种…

用mkdocs写文档#自动更新github-page

https://wuyisheng.github.io/blog 背景是上一篇博客 使用mkdocs,最后提及可以部署github page。这里说明下怎么自动部署。 当然,这篇博客主要的目的还是提供下github page的链接 :) 我是这样做的: step 1: pip3 i…

QT五 文件系统,QFile,QfileInfo

总览 QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。QFlie:访问本地文件或者嵌入资源;QTemporaryFile&a…

EF Core表达式树

文章目录 前言一、表达式树与委托的区别二、动态构建表达式树示例1示例2示例3高级技巧:表达式合并 三、ExpressionTreeToString安装方法基本用法支持的格式化风格 四、注意事项总结 前言 在 Entity Framework Core 中,表达式树(Expression T…

NVM安装速通使用手册(Windows版)NVM管理node版本命令手册 NVM使用手册

nvm(Node Version Manager)是一个用于管理Node.js版本的命令行工具。通过nvm,你可以在同一台机器上安装和切换多个Node.js版本,非常适合开发和测试在不同Node.js版本上运行的应用程序 一、安装地址 1. 官方下载: &…

vLLM命令行使用方法详解

vLLM 是一个针对大语言模型(LLMs)优化的高效推理和服务库。以下是 vLLM 命令行工具的详细使用方法解析,涵盖常见场景和参数配置: 一、核心命令行工具 vLLM 提供两个主要的命令行入口: 启动 API 服务器 用于部署 HTTP/OpenAI 兼容的 API 服务: python -m vllm.entrypoint…

# 基于 OpenCV 的选择题自动批改系统实现

在教育领域,选择题的批改工作通常较为繁琐且重复性高。为了提高批改效率,我们可以利用计算机视觉技术,通过 OpenCV 实现选择题的自动批改。本文将详细介绍如何使用 Python 和 OpenCV 实现一个简单的选择题自动批改系统。 1. 项目背景 选择题…

python黑科技:无痛修改第三方库源码

需求不符合 很多时候,我们下载的 第三方库 是不会有需求不满足的情况,但也有极少的情况,第三方库 没有兼顾到需求,导致开发者无法实现相关功能。 如何通过一些操作将 第三方库 源码进行修改,是我们将要遇到的一个难点…

第十三章:优化内存管理_《C++性能优化指南》_notes

优化内存管理 一、内存管理基础概念二、自定义分配器三、智能指针优化重点知识代码示例:智能指针性能对比 四、性能优化关键点总结多选题设计题答案与详解多选题答案设计题示例答案(第1题) 一、内存管理基础概念 重点知识 动态内存分配开销…

python笔记之函数

函数初探 python在要写出函数很简单,通过关键字def即可写出,简单示例如下 def add(a, b):return ab 以上即可以定义出一个简单的函数:接收两个变量a和b,返回a和b相加的结果,当然这么说也不全对,原因就是…

【服务器操作指南 - GPU 使用与文件传输】轻松掌握 GPU 状态查看和服务器文件传输技巧

0. 引言 在使用服务器时,高效管理 GPU 和文件传输是两项不可或缺的技能。 本指南旨在帮助您快速掌握服务器环境下的 GPU 使用状态监测方法,并简要介绍如何在服务器之间进行文件传输操作。 1. 查看服务器上的 gpu 使用状态 1.1 安装 gpustat 这条指令…

0330-YYYY-MM-DD格式日期比较大小

最简单的&#xff08;python&#xff09; from datetime import datetime def compare_time(time1,time2): time1_t datetime.strptime(time1,“%Y-%m-%d”) time2_t datetime.strptime(time2,“%Y-%m-%d”) if time1_t < time2_t: return time1_t elif time1_t > ti…

QFlightInstruments飞行仪表控件库

QFlightInstruments 是一个开源的飞行仪表控件库&#xff0c;专为基于 Qt 的应用程序设计。它提供了一系列仿真实飞机仪表的组件&#xff0c;适用于飞行模拟软件、航空电子系统或任何需要高仿真飞行仪表显示的项目。 主要功能 高仿真飞行仪表&#xff1a;包括空速表、高度表、…

VSCode 市场发现恶意扩展正在传播勒索软件!

在VSCode 市场中发现了两个隐藏着勒索软件的恶意扩展。其中一个于去年 10 月出现在微软商店&#xff0c;但很长时间没有引起注意。 这些是扩展ahban.shiba 和 ahban.cychelloworld&#xff0c;目前已从商店中删除。 此外&#xff0c;ahban.cychelloworld 扩展于 2024 年 10 月…

国信华源携AI+水利创新成果亮相第十五届防汛抗旱信息化技术交流会

直击展会现场 近日&#xff0c;以“人工智能赋能防汛抗旱 融合创新共御极端灾害”为主题的第十五届防汛抗旱信息化技术交流会在河南郑州召开。作为水旱灾害防御领域的专精企业&#xff0c;北京国信华源科技有限公司携自主研发的入户叫应预警系统及覆盖防汛抗旱全链条的智慧化场…

MATLAB语言的链表反转

MATLAB语言的链表反转 链表是一种常见的数据结构&#xff0c;与数组相比&#xff0c;链表在插入和删除操作方面具有更高的灵活性。然而&#xff0c;链表的一些操作&#xff0c;比如反转链表&#xff0c;对一些初学者来说可能是一个挑战。本篇文章将重点讨论如何使用MATLAB语言…

Oracle数据库数据编程SQL<2.2 DDL 视图、序列>

目录 一、Oracle 视图(Views) &#xff08;一&#xff09; Oracle 视图特点 &#xff08;二&#xff09;Oracle 视图创建语法 关键参数&#xff1a; &#xff08;三&#xff09;Oracle 视图类型 1、普通视图 2、连接视图&#xff08;可更新&#xff09; 3、对象视图 4…

QtAdvancedStylesheets使用

QtAdvancedStylesheets 是一个基于 Qt Widgets 的样式表(QSS)增强库,允许开发者通过类似 CSS 的方式深度定制 Qt 应用程序的界面风格,支持动态主题切换、动画效果和复杂控件样式设计。 1. 核心功能 高级样式表支持 使用 CSS-like 语法美化 Qt Widgets(如 QPushButton、Q…

QtAV入门

QtAV 是一个基于 FFmpeg 和 Qt 的高性能多媒体播放框架,提供强大的音视频解码、渲染和处理能力,适合开发跨平台的播放器、视频编辑和流媒体应用。 1. 核心功能 多格式支持 支持 H.264/H.265、VP9、AV1 等视频编码。 支持 MP3、AAC、Opus 等音频编码。 封装格式:MP4、MKV、…

[ C++ ] | C++11 从左值引用到右值引用

&#xff08;目录占位&#xff09; 1. 前言&#xff1a; C 11 是在 C 98 之后又一个变化比较大的标准。为C增加了很多东西&#xff0c;其中有一部分是有用的&#xff0c;有一部分是我自认为作用不是很大东西。这一章呢&#xff1f;我们就来说说C11我&#xff0c;我认为对性能…