编程-设计模式 12:代理模式

ops/2024/9/24 6:45:18/

设计模式 12:代理模式

定义与目的
  • 定义代理模式提供一个代理对象来控制对一个对象的访问。代理对象通常拥有与实际对象相同的接口,使得客户端代码可以透明地使用代理对象。
  • 目的:该模式的主要目的是控制对一个对象的访问,以及在访问之前或之后执行某些操作。
实现示例

假设我们有一个昂贵的图像加载操作,我们希望延迟加载直到真正需要显示时才加载图像。我们可以使用代理模式来实现这个需求。

// 接口 - 图像
interface Image {void display();
}// 实际主题 - 真实图像
class RealImage implements Image {private final String filename;public RealImage(String filename) {this.filename = filename;loadFromDisk();}private void loadFromDisk() {System.out.println("Loading image: " + filename);}@Overridepublic void display() {System.out.println("Displaying image: " + filename);}
}// 代理主题
class ProxyImage implements Image {private RealImage realImage;private final String filename;public ProxyImage(String filename) {this.filename = filename;}@Overridepublic void display() {if (realImage == null) {realImage = new RealImage(filename);  // 创建 RealImage 实例并加载图像}realImage.display();  // 显示图像}
}// 客户端代码
public class Client {public static void main(String[] args) {// RealImage 创建时即加载图像,而ProxyImage不会在创建时加载图像Image proxyImage = new ProxyImage("image.png");// 在这里调用display()时,实际的图像将被加载并显示proxyImage.display();  // 输出: Loading image: image.png//       Displaying image: image.png}
}
使用场景
  • 当你需要控制对一个对象的访问时。
  • 当你需要在访问一个对象前后执行某些操作时,例如缓存、权限检查、日志记录等。
  • 当创建一个对象的成本较高时,可以通过代理对象来延迟创建或共享实际对象。

代理模式通过提供一个代理对象来控制对实际对象的访问,这对于需要在访问对象前后执行额外操作的场景非常有用。

小结

代理模式是一种常用的结构型模式,它有助于控制对一个对象的访问,并在访问前后执行某些操作。这对于需要增加额外功能而又不想修改现有类的情况非常有用。


http://www.ppmy.cn/ops/93404.html

相关文章

微信小程序实战教程-1:京西购物商城实战

文章目录 1、起步1.1 uni-app简介1.2 开发工具1.2.1 下载HBuilderX1.2.2 安装HBuilderX1.2.3 安装scss/sass编译1.2.4 快捷键方案切换1.3 创建uni-app项目1.4 目录结构1.5 把项目运行到微信开发者工具1.6 使用Git管理项目1.6.1 本地管理1.6.2 把项目托管到码云1、起步 1.1 uni…

patroni+etcd开启SSL认证(三个节点证书一致 使用openssl命令)

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:14 文档用途 本文主要介绍Patroni架构中如何开启etcd的ssl证书认证。 详细信息 一、前提说明 patroni版本:3.0.2 etcd版本&#x…

【WebRTC指南】TURN 服务器

TURN 服务器 对于大多数 WebRTC 应用,客户端之间中继流量时需要使用服务器,因为在客户端之间通常无法实现直接套接字(除非这些客户端位于同一本地网络)。解决此问题的常用方法是使用 TURN 服务器。该术语代表在 NAT 中使用中继的遍历,是一种用于中继网络流量的协议。 目…

18. 基于ES实战海量数据检索

18. 基于ES实战海量数据检索 一. 概述二. Elasticsearch 全文检索1. 分布式搜索引擎2. 搜索引擎种类3. 倒排索引三. elastic使用1. 官网介绍2. docker安装3. elasticsearch-head工具*********************************************************一. 概述 二. Elasticsearch 全文…

oracle 判断某个字段包含某几个字符like或INSTR

在Oracle数据库中,如果你想判断某个字段是否包含某几个字符(字符序列),你可以使用LIKE操作符或者INSTR函数。选择哪一个取决于你的具体需求,比如是否需要对位置敏感或者是否需要在模式匹配中使用通配符。 使用LIKE操作…

电话机器人能提升销售效率

经济敏捷发展的当天,任何行业都不离开市场,无法让更多人理解本人企业本人的产物。那样的话,像电话营销那样抢手的行业也面临很大的困难,员工不仅工作压力大,工作时间长,呼叫量多,还能忍受顾客的…

linux常用命令备忘录

一、常用命令 查看被占用进程:ps ef|grep 11612 查看当前目录:pwd 查看文件的md5: (linux)md5sum 文件名 (windows)certutil -hashfile some_file MD5 查看当前目录的文件大小&#xff1a…

B树和B+树的插入、删除

1. B树 1.1 B树的定义 树也称树,它是一颗多路平衡查找树。我们描述一颗树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,用字母表示阶数。当取时,就是我们常见的二叉搜索树。 一颗阶的树定义如下: 每…