C++设计模式|结构型 代理模式

1.什么是代理模式?

代理模式Proxy Pattern是一种结构型设计模式,用于控制对其他对象的访问。

在代理模式中,允许一个对象(代理)充当另一个对象(真实对象)的接口,以控制对这个对象的访问通常用于在访问某个对象时引入一些间接层(中介的作用),这样可以在访问对象时添加额外的控制逻辑,比如限制访问权限,延迟加载。

比如说有一个文件加载的场景,为了避免直接访问"文件"对象,我们可以新增一个代理对象,代理对象中有一个对"文件对象"的引用 ,在代理对象的 load 方法中,可以在访问真实的文件对象之前进行一些操作,比如权限检查,然后调用真实文件对象的 load 方法,最后在访问真实对象后进行其他操作,比如记录访问日志。

2.代理模式的组成

  • Subject(抽象主题): 抽象类,通过接口或抽象类声明真实主题和代理对象实现的业务方法。

  • RealSubject(真实主题):定义了Proxy所代表的真实对象,是客户端最终要访问的对象。

  • Proxy(代理):包含一个引用,该引用可以是RealSubject的实例,控制对RealSubject的访问,并可能负责创建和删除RealSubject的实例。

3.代理模式的使用场景

代理模式可以控制客户端对真实对象的访问,从而限制某些客户端的访问权限,此外代理模式还常用在访问真实对象之前或之后执行一些额外的操作(比如记录日志),对功能进行扩展。

以上特性决定了代理模式在以下几个场景中有着广泛的应用:

  • 虚拟代理:当一个对象的创建和初始化比较昂贵时,可以使用虚拟代理,虚拟代理可以延迟对象的实际创建和初始化,只有在需要时才真正创建并初始化对象。
  • 安全代理:安全代理可以根据访问者的权限决定是否允许访问真实对象的方法。

但是代理模式涉及到多个对象之间的交互,引入代理模式会增加系统的复杂性,在需要频繁访问真实对象时,还可能会有一些性能问题。

4.代理模式和适配器模式有什么区别

代理模式的主要目的是控制对对象的访问。通常用于在访问真实对象时引入一些额外的控制逻辑,如权限控制、延迟加载等。

适配器模式的主要目的是使接口不兼容的对象能够协同工作。适配器模式允许将一个类的接口转换成另一个类的接口,使得不同接口的类可以协同工作

5.C++实现代理模式

【设计模式专题之代理模式】7-小明买房子 (kamacoder.com)https://kamacoder.com/problempage.php?pid=1088

题目描述

小明想要购买一套房子,他决定寻求一家房屋中介来帮助他找到一个面积超过100平方米的房子,只有符合条件的房子才会被传递给小明查看。

输入描述

第一行是一个整数 N(1 ≤ N ≤ 100),表示可供查看的房子的数量。

接下来的 N 行,每行包含一个整数,表示对应房子的房屋面积。

输出描述

对于每个房子,输出一行,表示是否符合购房条件。如果房屋面积超过100平方米,输出 "YES";否则输出 "NO"。

输入示例

3
120
80
110

输出示例

YES
NO
YES

思路分析:

根据代理模式的组成,我们要有一个抽象主题(抽象类),抽象类声明真实主题和代理对象实现的业务方法。这里的业务方法就是买房子。再次基础上,我们需要有一个对应的真实主题(具体的类,继承于刚才的抽象主题),是能够创建出客户端最终要访问的对象。最后,要有一个代理者类来控制真实主题。对于接口函数的参数,由于题目要判断房子的面积,所以要有一个参数area。

代码实现:

cpp 复制代码
#include<iostream>
using namespace std;

//1、定义抽象主题 买房子
class PurchaseHouse{
public:
    //定义一个房屋筛选的纯虚函数,使得抽象主题这个类为抽象类
    virtual void HouseFilter(int area) = 0;
};

//2、定义真实主题,继承上面的抽象主题
class Purchase : public PurchaseHouse{
public:
    virtual void HouseFilter(int area){
        cout<<"YES"<<endl;
    }
};

//3、定义代理者类,里面要包含真是主题的实例
class Proxy{
private: 
    //定义真实主题实例
    Purchase purchase;
public:
    //定义给客户端提供的查询借口
    void SearchHouse(int area){
        //调用真实主题的对象的方法来对面积做比较
        if(area > 100){
            purchase.HouseFilter(area);
        }
        else {
            cout<<"NO"<<endl;
        }
    }
};


int main()
{
    //客户端程序
    //定义代理商实例
    Proxy MyProxy;
    
    //输入信息
    int N, area;
    cin>>N;
    
    for(int i=0; i<N; i++){
        cin>>area;
        //输入房屋面积后就可以通过代理商进行房屋查询了
        MyProxy.SearchHouse(area);
    }
    
    return 0;
}

关于load的写法,可以参考这篇博文。设计模式之代理模式(C++)_c++ 代理模式-CSDN博客https://zhaitianbao.blog.csdn.net/article/details/129949951

相关推荐
挥剑决浮云 -9 分钟前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记
丶Darling.25 分钟前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo52036 分钟前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
小柯J桑_1 小时前
C++:STL简介
c++·stl
刷帅耍帅1 小时前
设计模式-命令模式
设计模式·命令模式
码龄3年 审核中1 小时前
设计模式、系统设计 record part03
设计模式
刷帅耍帅1 小时前
设计模式-外观模式
设计模式·外观模式
咖啡里的茶i1 小时前
C++之继承
c++
NormalConfidence_Man2 小时前
C++新特性汇总
开发语言·c++
刷帅耍帅2 小时前
设计模式-迭代器模式
设计模式·迭代器模式