不得不说的结构型模式-代理模式

news2025/1/18 17:07:26

目录

代理模式:

下面是一个简单的C++代码案例

下面是面试中可能遇到的问题:


代理模式:

代理模式是一种结构型设计模式,它通过引入一个代理对象来控制对另一个对象的访问。代理对象充当原始对象的中介,通过拦截对原始对象的访问来提供额外的功能或限制访问。

在代理模式中,通常有三个角色:

  • 抽象主题(Subject):定义了代理对象和原始对象的公共接口,是代理对象和原始对象的公共父类或接口。
  • 真实主题(RealSubject):定义了代理对象所代表的真实对象,是代理对象所包装的对象。
  • 代理(Proxy):定义了代理对象,并持有一个指向真实主题对象的引用,同时实现了与抽象主题相同的接口。

代理对象通常在访问原始对象之前和之后执行额外的处理,如记录日志、控制访问权限、缓存数据等。代理对象还可以通过控制对原始对象的访问来实现一些特殊的功能,如延迟加载、数据过滤等。

 

下面是一个简单的C++代码案例

 以下是一个简单的C++代理模式代码示例,假设我们有一个接口类 Subject 和一个实现类 RealSubject,我们可以通过代理类 Proxy 来访问 RealSubject 对象,并实现额外的功能。

#include <iostream>
#include <string>

using namespace std;

// 抽象主题
class Subject {
public:
    virtual void request() = 0;
};

// 真实主题
class RealSubject : public Subject {
public:
    void request() override {
        cout << "RealSubject: handling request." << endl;
    }
};

// 代理
class Proxy : public Subject {
private:
    RealSubject* realSubject_;

    void checkAccess() const {
        cout << "Proxy: checking access prior to request." << endl;
    }

    void logAccess() const {
        cout << "Proxy: logging request." << endl;
    }

public:
    Proxy(RealSubject* realSubject) : realSubject_(realSubject) {}

    void request() override {
        checkAccess();
        realSubject_->request();
        logAccess();
    }
};

// 客户端代码
int main() {
    RealSubject* realSubject = new RealSubject();
    Proxy* proxy = new Proxy(realSubject);

    proxy->request();

    delete proxy;
    delete realSubject;

    return 0;
}

在上面的代码中,RealSubject 类表示真实的主题,实现了抽象主题 Subject 的接口。Proxy 类表示代理对象,它也实现了抽象主题 Subject 的接口,并持有一个指向真实主题对象的引用。在 Proxy 类中,我们可以实现一些额外的功能,如控制访问权限、记录日志等。

在客户端代码中,我们创建了一个 RealSubject 对象和一个 Proxy 对象,并通过调用 Proxy 对象的 request() 方法来访问 RealSubject。

在上述代码中,Proxy 类作为 RealSubject 的代理对象,通过实现 request() 方法来代理 RealSubject 的 request() 方法。在 request() 方法中,Proxy 对象会先进行一些额外的处理,如检查访问权限和记录日志,然后再调用 RealSubject 对象的 request() 方法,最后再进行一些额外的处理。

当客户端代码调用 Proxy 对象的 request() 方法时,实际上是通过代理对象来访问真实主题对象的 request() 方法。这种方式可以让我们控制对真实主题对象的访问,从而实现一些特殊的功能,如权限控制、数据过滤等。

下面是面试中可能遇到的问题:

  1. 1什么是代理模式?它的主要作用是什么?

答:代理模式是一种结构型设计模式,用于为另一个对象提供一个替代品或占位符,以控制对该对象的访问。代理对象充当原始对象的中介,通过拦截对原始对象的访问来提供额外的功能或限制访问。代理模式的主要作用是增强对象的功能,保护对象的访问,以及实现延迟加载等功能。

  1. 2代理模式有哪些常见的应用场景?

答:代理模式在很多应用中都有广泛的应用,其中一些常见的应用场景包括:

  • 远程代理:将远程对象封装在代理对象中,使得客户端可以通过网络访问远程对象。
  • 虚拟代理:用于延迟加载,当对象的创建成本很高时,可以使用虚拟代理在需要时才创建对象。
  • 安全代理:控制对原始对象的访问,限制客户端的访问权限。
  • 智能代理:提供额外的功能,如缓存、日志、事务管理等。
  1. 3代理模式和适配器模式有何区别?

答:代理模式和适配器模式都是结构型设计模式,但它们的主要目的不同。代理模式是为了增强对象的功能,保护对象的访问,以及实现延迟加载等功能,而适配器模式是为了将一个接口转换为另一个接口,以便让不兼容的类能够合作工作。在代理模式中,代理对象和原始对象通常具有相同的接口,而在适配器模式中,适配器对象和被适配对象通常具有不同的接口。

此外,在代理模式中,代理对象通常可以控制对原始对象的访问,可以拦截和过滤一些方法调用,而在适配器模式中,适配器对象主要是为了兼容不同的接口而存在,不涉及控制访问和拦截调用等功能。

  1. 4代理模式有哪些缺点?

答:代理模式虽然可以提供额外的功能和保护对象的访问,但同时也会带来一些缺点,其中一些常见的缺点包括:

  • 代理模式会增加系统的复杂性,引入了更多的对象和间接层,增加了代码的维护难度。
  • 代理模式可能会降低系统的性能,由于代理对象需要进行额外的处理和转发,因此会产生额外的开销和延迟。
  • 代理模式可能会引入新的安全问题,由于代理对象可以控制对原始对象的访问,因此需要谨慎处理代理对象的安全性和可信度。

总的来说,代理模式是一种非常常用的设计模式,可以在不改变原始对象的情况下对其进行访问控制、增加额外的功能等。在实际的软件开发中,代理模式也被广泛应用,如数据库连接池、远程代理等场景中都可以使用代理模式来实现。

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

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

相关文章

倾斜摄影超大场景的三维模型的顶层合并的点云抽稀处理技术分析

倾斜摄影超大场景的三维模型的顶层合并的点云抽稀处理技术分析 倾斜摄影超大场景的三维模型的顶层合并需要进行点云抽稀处理&#xff0c;以减小数据量和提高数据处理和展示性能。以下是几种常用的点云抽稀处理技术&#xff1a; 1、体素栅格化&#xff1a;将点云数据转换为3D体…

【TCP 协议】报文格式,数据可靠传输的机制(一)

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 本期为大家带来的是网络编程的 TCP 传输控制协议的概念 &#xff0c;首先会讲解 TCP 协议的报文格式&#xff0c;在学习报文格式之后&#xff0c;会学习两种 TCP 保证数据可靠传输的机制&#xff0c;确认应答…

getType() 和 getGenericType()的区别

处理泛型时会经常用到这两个方法&#xff0c;但是二者的区别是什么&#xff1f; 先看看官方的解释&#xff1a; getType 》&#xff1a;Returns a Class object that identifies the declared type for the field represented by this Field object. 返回字段对象声明类型的…

nodejs+python+php+springboot+vue 婚庆公司服务网站管理系统

管理员模块 &#xff08;1&#xff09;信息管理模块&#xff1a;对商家和个人的查看&#xff0c;修改。 &#xff08;2&#xff09;留言管理模块&#xff1a;对留言进行管理&#xff0c;确定是否能进行发布&#xff0c;对留言进行回复。 &#xff08;3&#xff09;权限管理&…

Git常用命令2

git commit --amend 有时候我们提交完了才发现漏掉了几个文件没有添加&#xff0c;或者提交信息写错了。 此时&#xff0c;可以运行带有 --amend 选项的提交命令来重新提交,这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改&#xff08;例如&#xff0c;…

【C++入门】一篇搞懂auto关键字

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】 目录 作用不那么大的场景auto真正的价值注意点auto不能推导的场景范围for范围for的使用条件 作用不那么大的场景 在C中推出了…

工业元宇宙对于制造业的影响有哪些?

伴随元宇宙的快速发展&#xff0c;它在诸多现实场景中都实现了广泛应用&#xff0c;特别是在全球科技与产业竞争核心的智能制造领域。元宇宙与智能制造融合的本质是重构企业研发、制造、销售、终端四大场景&#xff0c;相当于把企业打包进虚拟世界&#xff0c;在虚拟世界中建设…

(五)ArcCatalog应用基础——ArcCatalog基本操作

&#xff08;二&#xff09;ArcCatalog应用基础——ArcCatalog基本操作 当ArcCatalog 与文件夹、数据库或者 GIS 服务器建立链接之后&#xff0c;就可以通过 ArcCatalog 来浏览其中的内容。ArcCatalog 具有浏览地图和数据、创建元数据、搜索地图数据、管理数据源等功能&#x…

SpringBoot RabbitMQ 死信队列

1. 死信定义 无法被消费的消息&#xff0c;称为死信。 如果死信一直留在队列中&#xff0c;会导致一直被消费&#xff0c;却从不消费成功&#xff0c;专门有一个存放死信的队列&#xff0c;称为死信队列(DDX, dead-letter-exchange)。 死信队列 DLX&#xff0c;Dead Letter Exc…

火山引擎 BVE 视频图片硬件编码器演进之路

动手点关注 干货不迷路 前言 近日&#xff0c;第 17 届世界编码器大赛 MSU 2022 公布硬件编码器比赛结果&#xff0c;在 60 fps&#xff08;帧率&#xff09;的超快视频编码赛道上&#xff0c;火山引擎多媒体实验室自主研发的 BVE 1.1 编码器表现突出&#xff0c;荣获最佳 FPGA…

计算机网络学习06(HTTP1.0 vs HTTP1.1)

1、响应状态码 HTTP/1.0仅定义了16种状态码。HTTP/1.1中新加入了大量的状态码&#xff0c;光是错误响应状态码就新增了24种。比如说&#xff0c;100 (Continue)——在请求大资源前的预热请求&#xff0c;206 (Partial Content)——范围请求的标识码&#xff0c;409 (Conflict)…

【C++】priority_queue使用和模拟实现——仿函数

文章目录 1. priority_queue的使用1.priority_queue的介绍2.priority_queue的结构3. 主要接口4. 使用示例 2. 仿函数1. 仿函数的概念2.尝试实现仿函数 3.priority_queue的模拟实现1.priority_queue的结构2. 接口实现1.向下调整算法2. 向上调整算法3.构造函数4.修改数据5.获取数…

机器学习 -Statsmodels

机器学习记录 Statsmodels 用于探索数据, 估计模型, 并运行统计检验. conda install -y statsmodels线性回归 import numpy as np import pandas as pd import matplotlib.pyplot as plt import statsmodels.api as sm import statsmodels.datasets.utils as du import sea…

数据结构【二】:霍夫曼编码

霍夫曼编码&#xff08;Huffman Coding&#xff09;是可变长编码&#xff08;VLC&#xff09;的一种。本质上使用变长编码表对源符号进行编码&#xff0c;通过评估源符号出现概率的方法进行分类&#xff0c;将出现几率较高的源字符使用较短的编码&#xff0c;出现几率较低的源字…

Hive优化补充

目录 一、表设计优化 1.通过设计分区表&#xff0c;增加动态分区&#xff0c;查询时避免全表扫描 2.设计分桶表&#xff1a;适用于大表join大表的情况 最后&#xff0c;两张大表进行join转为两张分桶表进行join&#xff1a; 二、文件存储 1.文件格式-概述 2.文件格式——…

学系统集成项目管理工程师(中项)系列13b_人力资源管理(下)

1. 项目团队建设 1.1. 塔克曼(Tuckman)阶梯理论 1.2. 理论基础 1.2.1. 激励理论 1.2.1.1. 马斯洛需要层次理论 1.2.1.1.1. 生理需要 1.2.1.1.2. 安全需要 1.2.1.1.3. 社会交往的需要 1.2.1.1.4. 自尊的需要 1.2.1.1.5. 自我实现的需要 1.2.1.2. 赫茨伯格的双因素理论…

Leetcode力扣秋招刷题路-0802

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 802. 找到最终的安全状态 有一个有 n 个节点的有向图&#xff0c;节点按 0 到 n - 1 编号。图由一个 索引从 0 开始 的 2D 整数数组 graph表示&#xff0c; graph[i]是与节点 i 相邻的节…

Git HEAD及detached head

背景&#xff1a;最近在使用git checkout重置HEAD指向&#xff0c;偶尔会出现Detached HEAD提示&#xff0c;于是想探究一下具体的原理及过程&#xff0c;遂写下了这篇文章。一般checkout用于切换分支和检出历史的某个节点&#xff0c;或恢复工作区的文件&#xff0c;这三个功能…

OpenHarmony JS Demo开发讲解

项目结构 打开entry→src→main→js&#xff0c;工程的开发目录如图所示 其中&#xff0c; i18n文件夹&#xff1a;用于存放配置不同语言场景的资源&#xff0c;比如应用文本词条&#xff0c;图片路径等资源。en-US.json文件定义了在英文模式下页面显示的变量内容&#xff0c…

Java 泛型为什么设计成是可以擦除的

Java 泛型是 Java 5 引入的一种类型安全的编程机制&#xff0c;它允许在编译时指定泛型类型参数&#xff0c;从而提高代码的类型安全性和可读性。然而&#xff0c;Java 泛型的实现方式是通过类型擦除来实现的&#xff0c;这也引发了一些争议。本文将介绍 Java 泛型为什么设计成…