设计模式:(代理模式)

article/2025/8/19 20:23:16

1.定义

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
简单来说:代理模式为其他对象提供一种代理以控制对这个对象的访问。

2.概述

当用户希望和某个对象打交道,但程序可能不希望用户直接访问该对象,而是提供一个特殊的对象,这个特殊的对象被称作当前用户要访问对象的代理,程序让用用户和对象的代理打交道,即让用户通过访问代理来访问想要访问的对象。在代理模式中,代理的特点是:它与所代理的对象实现了相同的接口,也就是说代理和它所代理的对象向用户公开了相同的方法,当用户请求代理调用这样的方法时,代理可能需要验证某些信息或检查它所代理的对象是否可用,当代理确认它所代理的对象能够电泳相同的方法时,就把实际的方法调用委派给它所代理的对象,即让所代理的对象调用同样的方法。
例如: 秘书是老板的代理,老板个秘书都有接听电话的方法:herePhone();
公司要求用户必须首先和秘书通电话才能和老板通电话,也就是说,用户必须首先请求秘书调用herePhone方法,当秘书确认老板可以接听电话时,就将用户的实际请求委派给老板,即让老板调用herePhone方法,如下所示:
在这里插入图片描述

3.应用场景

1、远程代理。
2、虚拟代理。
3、Copy-on-Write 代理。
4、保护(Protect or Access)代理。
5、Cache代理。
6、防火墙(Firewall)代理。
7、同步化(Synchronization)代理。
8、智能引用(Smart Reference)代理。

4.模式的结构和使用

代理模式主要包括三种角色
1.抽象主题(Subject):抽象主题是一个接口,该接口是对象和它代理所共有的接口,即是RealSubject角色和Proxy角色实例所共同实现的接口;
2.实际主题(ReaLSubject):实际主题是实现抽象主题接口的类。实际主题的实例是代理角色Proxy实例所要代理的对象;
3.代理(Proxy):代理是实现抽象主题接口的类。代理包含主题接口声明的变量,该变量用来存放RealSubject角色的实例引用,这样一来,代理的实例就可以控制对它所包含的RealSubject角色的实例访问,即可以控制对它所代理对象的访问。

1.代理模式的类图

前面所提到的Phone接口就是代理模式的抽象主题(Subject),Boss类就是实际主题(RealSubject)角色,Secretary类就睡代理角色(Proxy)。
在这里插入图片描述

2.结构的描述

以下通过一个简单的问题来描述怎么样使用代理模式,这个简单问题就是:
用户输入三个代表三角形三边长的数值,代理对象验证用户输入的三个数值是否能够构成三角形,如果能构成三角形,就创建一个三角形对象,并让该三角形对象计算自身的面积。
1.抽象主题(Subject)
定义了一个类名为Geometry的接口,里面定义了一个抽象方法getArea

package com.xing.proxy;
//几何图形接口
public interface Geometry {public double getArea();
}

2.实际主题(RealSubject)
在实际主题中,利用海伦公式给出了计算三角形面积的公式 ,实现了抽象方法getArea,代码如下所示:

package com.xing.proxy;public class Triangle implements Geometry{double sideA,sideB,sideC,area;public Triangle(double sideA, double sideB, double sideC) {this.sideA = sideA;this.sideB = sideB;this.sideC = sideC;}//利用海伦公式计算三角形的面积//利用@Overridepublic double getArea() {double p=(sideA+sideB+sideC)/2;return Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));}
}

3.代理
在代理类getArea方法中,如果用户输入的三条边可以构成三角形,则计算三角形面积,否则就不用创建三角形对象,直接返回-1;

package com.xing.proxy;public class TriangleProxy implements Geometry{double sideA,sideB,sideC;Triangle triangle;public void setABC(double sideA, double sideB, double sideC) {this.sideA = sideA;this.sideB = sideB;this.sideC = sideC;}@Overridepublic double getArea() {if(sideA+sideB>sideC && sideB+sideC>sideA && sideC+sideA>sideB){//满足条件则可以构成三角形triangle=new Triangle(sideA,sideB,sideC);double area = triangle.getArea();//让代理对象调用getArea方法return area;}else{return -1;}}
}

4.主程序测试

package com.xing.proxy;import java.util.Scanner;public class Application {public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请输入三角形的三条边的长度");double a=sc.nextDouble();double b=sc.nextDouble();double c=sc.nextDouble();TriangleProxy proxy=new TriangleProxy();proxy.setABC(a,b,c);double area = proxy.getArea();System.out.println("面积是:"+area);}
}

5.测试结果展示:
在这里插入图片描述

5.代理模式的优点

1.代理模式可以屏蔽用户真正请求的对象,使用户程序和真正的对象之间解耦;
2.使用代理来担当那些创建耗时的对象的替身。


http://chatgpt.dhexx.cn/article/3QMZ7D6R.shtml

相关文章

Nginx 虚拟主机与反向代理

一、虚拟主机 虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的Intemet服务器功能(WWW、FTP、Emai…

【设计模式】学习笔记16:代理模式之虚拟代理(实现CD封面加载器)

本文出自 http://blog.csdn.net/shuangde800 在上篇中,我们学习了代理模式,并用Java RMI实现了一个最简单的远程代理。 实际上代理模式并不仅仅应用与远程代理,还有很多其他的应用。 比如:虚拟代理。 代理模式可以以很多形式出现…

代理模式(三):远程代理,虚拟代理,缓冲代理

15.4 远程代理 远程代理(Remote Proxy)是一种常用的代理模式,它使得客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速响应并处理客户端的请求。远程代理可以将网络的细节隐藏起来,使得客…

虚拟机 全局代理 主机代理_比较虚拟代理与真实代理的性能

云计算的关键基础是虚拟化。 面向云的设计人员,开发人员和管理员需要问自己的一个问题是:“虚拟化组件的性能水平如何与其“真实”物理对应物相提并论?” “如果存在负面差距,我该如何克服呢?” 本文介绍了在虚拟机&a…

设计模式——代理模式(虚拟代理)

代理模式的类型分为: (1)虚拟代理 (2)远程代理 (3)智能指引 (4)保护代理 这一篇主要讲虚拟代理,想要知道其他类型讲解的小伙伴可以去我其他博客翻一翻哦。 首先来理解一波虚拟代理,啥叫虚拟代理? 举个很常见也很通俗的例子,咱们平时抽奖的时候,是不是都想要抽个…

[转载]虚拟代理模式(Virtualnbsp;Proxy)

虚拟代理模式(Virtualnbsp;Proxy) 第25章 虚拟代理模式(Virtual Proxy) 描述: 虚拟代理模式 (Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候。在特定的应用 中&#x…

代理模式——虚拟代理(二)

代理模式定义 为另一个对象提供一个替身或占位符以控制对这个对象的访问。使用代理模式创建代表对象,让代表对象控制对某对象的访问,被代理的对象可是远程的对象、创建开销大的对象或需要安全控制的对象。 代理分三种: 1.远程代理&#xff…

SQL语法与数据库快速入门(1)

目录 数据库简介数据库分类常用数据库简介使用场景MySql 的安装与配置数据库客户端工具MySql 介绍SQL 简介DDL 数据库操作-创建DDL 数据库操作-查看DDL 数据库操作-修改DDL 数据库操作-删除DDL 数据库表操作简介DDL 数据库表操作-创建DDL 数据库表操作-查看DDL 数据库表操作-修…

SQL语法与数据库快速入门(2)

目录: 多表简介SQL 约束-外键约束多表关系简介多表查询多表查询-内连接查询多表查询-外连接查询子查询简介子查询实战数据库进阶redis 内存数据库mongodb nosql 数据库neo4j 图数据库 1.多表简介 多表及使用场景介绍: 多表顾名思义就是在数据库设计中…

【数据库】MYSQL轻松入门

文章目录 MYSQL入门一、MYSQL概述1. 数据库相关概念1.1 数据库,数据库管理系统与SQL1.2 数据库种类以及主流数据库管理系统排名1.2.1 数据库的种类1.2.2 数据库主流排名 1.3 MySQL数据库安装1.3.1 下载1.3.2 修改密码 1.4 数据模型 二、SQL2.1 通用语法与注释2.2 SQ…

Java连接mysql数据库的五分钟快速入门教程

总体流程:数据库->Java 总体步骤: 1.创建数据库并新建表 2.创建一个Java项目,在项目下新建文件夹lib,类型为Directory 3.将下载好mysql-connector-java-8.0.27.jar放到lib目录下 4.将lib下的依赖添加到Java项目中 5.编写代码连…

数据库快速入门教程--视频

数据库快速入门教程--视频 下载地址:http://v.51work6.com/courseInfoRedirect.do?actioncourseInfo&courseId240579本课程是这个课程体系的核心之一,为软件开发人员所需数据库知识的学习教材,而不是培训一个DBA(数据库管理员…

Docker 安装与操作 Mysql 数据库快速入门

目录 演示环境说明 Mysql 镜像检索 Mysql 镜像下载 Mysql 容器运行 错误运行方式 正确运行方式 端口映射 连接测试 高级命令指定编码运行 演示环境说明 1、《 Docker 镜像操作 常用命令》中说明了如何从 Docker Hub 上下载镜像,《 Docker 容器操作 常用命…

数据库(MySQL)基础快速入门!

前言:这篇送给那些想要学会数据库,但又不想花太多时间的同学们。看了这篇数据库知识,轻轻松松搞定它!用不同的工具操作数据库命令可能会有小小的不同,我用的是系统自带的cmd。(凡是数据库名称,数…

MySQL数据库1——数据库快速入门

MySQL数据库——数据库基础 (一)为什么使用数据库 数据库用来存储海量数据数据库利于数据查询和管理数据库相对于文件安全性更高数据库相对于文件利于控制 (二)MySQL的基本使用 安装好MySQL数据库以后,连接服务器。…

mysql快捷创建数据库_mysql数据库快速入门(1)

1、数据库操作 1.1、连接mysql服务器 mysql -u root( 用户名 ) -p 1.2、退出mysql命令提示窗 exit 1.3、查看版本 SELECT VERSION(); 1.4、列出数据库列表 SHOW DATABASES; 1.5、创建数据库 CREATE DATABASE IF NOT EXISTS [database] DEFAULT CHARSET UTF8; 1.6、选择要操作的…

SQLite3数据库的快速入门菜鸟教程

SQLite3是一个轻量级嵌入式数据库,其主要有以下的特点: 1、零配置无需安装和管理配置; 2、储存在单一磁盘文件中; 3、数据库文件可在不同字节序的机器自由共享; 4、比目前流行的大多数数据库对数据的操作要快&…

MySQL数据库快速入门

MySQL基础 1、数据库相关概念 以前我们做系统,数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会丢失的效果,当然文件存储也有它的弊端。假设在文件中存储以下的数据: 姓名 年龄 性别 住址 张三 23 男 北京西三旗…

MySQL数据库快速入门到精通(超详细保姆级,建议收藏)这可能是目前最适合你的教程,从基础语法到实例演示。

前言 此文章旨在为需要掌握快速开发和复习MySQL的同学所准备,您完全可以把此文章当作参考文档来使用,本文将尽量精简,使您快速的理解和掌握语法。 关于MySQL MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,…

超经典两万字,MySQL数据库快速入门。

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」:此文章已录入专栏《MySQL数据库快速入门》 MySQL快速入门 一、环境准备1. MySQL下载及安装2. MySQL启动3. MySQL客…