当前位置: 首页 > news >正文

设计模式 -- 代理模式(Proxy Pattern)

代理模式:一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
介绍
  • 意图:为其他对象提供一种代理以控制对这个对象的访问。
  • 主要解决问题:在直接访问对象时带来的问题,直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
  • 关键代码:实现与被代理类组合。
  • 优点:1、职责清晰。 2、高扩展性。 3、智能化。
  • 缺点:1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
示例

以绘制 三角形、圆形、矩形功能为例:

  1. 定义接口
    public interface Draw {void circularAction();void rectangleAction();void triangleAction();
    }
  2. 实现类
    
    public class RealDraw implements Draw {@Overridepublic void circularAction() {//绘制圆形}@Overridepublic void rectangleAction() {//矩形}@Overridepublic void triangleAction() {//三角形}
    }
    
  3. 代理类
    public class ProxyDraw implements Draw {private RealDraw realDraw;@Overridepublic void circularAction() {if(realDraw == null){realDraw = new RealDraw();}realDraw.circularAction();}@Overridepublic void rectangleAction() {if(realDraw == null){realDraw = new RealDraw();}realDraw.rectangleAction();}@Overridepublic void triangleAction() {if(realDraw == null){realDraw = new RealDraw();}realDraw.triangleAction();}
    }
  4. 使用
        public static void main(String[] args) {ProxyDraw proxyDraw = new ProxyDraw();proxyDraw.circularAction();proxyDraw.rectangleAction();proxyDraw.triangleAction();}

相关文章:

  • 【1567.乘积为正数的最长子数组长度】
  • 【ROS】RViz2源码分析(二):main函数及编译配置详解
  • 大数据基础设施搭建 - JDK
  • Java继承和多态(2)
  • 手撕无头单链表
  • YOLOv5项目实战(3)— 如何批量命名数据集中的图片
  • 代码随想录算法训练营Day 53 || 1143.最长公共子序列、1035.不相交的线、53. 最大子序和
  • 【T690 之十一】基于方寸EVB2开发板,结合 Eclipse+gdb+gdbserver 调试 CCAT 的流程总结
  • 场景图形管理-多视图多窗口渲染示例(4)
  • redis高级案列case
  • 二十七、W5100S/W5500+RP2040树莓派Pico<iperf 测速示例>
  • 【数据处理】Python:实现求条件分布函数 | 求平均值方差和协方差 | 求函数函数期望值的函数 | 概率论
  • 相机通用类之LMI激光三角相机(3D),软触发硬触发(飞拍),并输出halcon格式对象
  • Linux命令--重启系统的方法
  • 电源电压范 围宽、功耗小、抗干扰能力强的国产芯片GS069适用于电动工具等产品中,采用SOP8的封装形式封装
  • Android优雅地处理按钮重复点击
  • HTTP那些事
  • PAT A1017 优先队列
  • select2 取值 遍历 设置默认值
  • Spring Boot MyBatis配置多种数据库
  • 大主子表关联的性能优化方法
  • 分享一份非常强势的Android面试题
  • 前端性能优化——回流与重绘
  • 深入浏览器事件循环的本质
  • 自定义函数
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 阿里云ACE认证之理解CDN技术
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 组复制官方翻译九、Group Replication Technical Details
  • #if和#ifdef区别
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (SpringBoot)第二章:Spring创建和使用
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (分布式缓存)Redis分片集群
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (四) 虚拟摄像头vivi体验
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET开发不可不知、不可不用的辅助类(一)
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • [.net]官方水晶报表的使用以演示下载
  • []T 还是 []*T, 这是一个问题
  • [ACTF2020 新生赛]Upload 1
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [AX]AX2012 R2 出差申请和支出报告
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现
  • [CERC2017]Cumulative Code
  • [dart学习]第四篇:函数
  • [INSTALL_FAILED_TEST_ONLY],Android开发出现应用未安装