C++ 设计模式之代理模式

这篇具有很好参考价值的文章主要介绍了C++ 设计模式之代理模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】

【简介】什么是代理模式

        代理模式 Proxy Pattern 是⼀种结构型设计模式,⽤于控制对其他对象的访问。在代理模式中,允许⼀个对象(代理)充当另⼀个对象(真实对象)的接⼝,以控制对这个对象的访问。通常⽤于在访问某个对象时引⼊⼀些间接层(中介的作⽤),这样可以在访问对象时添加额外的控制逻辑,⽐如限制访问权限,延迟加载。
        ⽐如说有⼀个⽂件加载的场景,为了避免直接访问“⽂件”对象,我们可以新增⼀个代理对象,代理对象中有⼀个对“⽂件对象”的引⽤,在代理对象的 load ⽅法中,可以在访问真实的⽂件对象之前进⾏⼀些操作,⽐如权限检查,然后调⽤真实⽂件对象的 load ⽅法,最后在访问真实对象后进⾏其他操作,⽐如记录访问⽇志。


【基本结构】

代理模式的主要⻆⾊有:

  • Subject(抽象主题): 抽象类,通过接⼝或抽象类声明真实主题和代理对象实现的业务⽅法。
  • RealSubject(真实主题):定义了Proxy所代表的真实对象,是客户端最终要访问的对象。
  • Proxy(代理):包含⼀个引⽤,该引⽤可以是RealSubject的实例,控制对RealSubject的访问,并可能负责创建和删除RealSubject的实例。

C++ 设计模式之代理模式,c++,设计模式,代理模式


【实现方式】

        代理模式的基本实现分为以下⼏个步骤:(以Java代码做示例)

1. 定义抽象主题, ⼀般是接⼝或者抽象类,声明真实主题和代理对象实现的业务⽅法。

// 1. 定义抽象主题
interface Subject {
    void request();
}

2.定义真实主题,实现抽象主题中的具体业务
 

// 2. 定义真实主题
class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject handles the request.");
    }
}

3.定义代理类,包含对RealSubject 的引⽤,并提供和真实主题相同的接⼝,这样代理就可以替代真实主题,并对真实主题进⾏功能扩展。

// 3. 定义代理
class Proxy implements Subject {
    // 包含⼀个引⽤
    private RealSubject realSubject;

    @Override
    public void request() {
    // 在访问真实主题之前可以添加额外的逻辑
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
    // 调⽤真实主题的⽅法
        realSubject.request();

    // 在访问真实主题之后可以添加额外的逻辑
    }
}

4.客户端使⽤代理

// 4. 客户端使⽤代理
public class Main {
    public static void main(String[] args) {
        // 使⽤代理
        Subject proxy = new Proxy();
        proxy.request();
    }
}

【使用场景】

        代理模式可以控制客户端对真实对象的访问,从⽽限制某些客户端的访问权限,此外代理模式还常⽤在访问真实对象之前或之后执⾏⼀些额外的操作(⽐如记录⽇志),对功能进⾏扩展。
        以上特性决定了代理模式在以下⼏个场景中有着⼴泛的应⽤:

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

        但是代理模式涉及到多个对象之间的交互,引⼊代理模式会增加系统的复杂性,在需要频繁访问真实对象时,还可能会有⼀些性能问题。
        代理模式在许多⼯具和库中也有应⽤:

  • Spring 框架的 AOP 模块使⽤了代理模式来实现切⾯编程。通过代理,Spring 能够在⽬标对象的⽅法执⾏前、执⾏后或抛出异常时插⼊切⾯逻辑,⽽不需要修改原始代码。
  • Java 提供了动态代理机制,允许在运⾏时⽣成代理类。
  • Android中的Glide框架使⽤了代理模式来实现图⽚的延迟加载。

【扩展】代理模式和适配器模式有什么区别

        代理模式的主要⽬的是控制对对象的访问。通常⽤于在访问真实对象时引⼊⼀些额外的控制逻辑,如权限控制、延迟加载等。
        适配器模式的主要⽬的是使接⼝不兼容的对象能够协同⼯作。适配器模式允许将⼀个类的接⼝转换成另⼀个类的接⼝,使得不同接⼝的类可以协同⼯作。


【C++ 编码部分】

1. 题目描述

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

2. 输入描述

        第一行是一个整数 N(1 ≤ N ≤ 100),表示可供查看的房子的数量。接下来的 N 行,每行包含一个整数,表示对应房子的房屋面积。

3. 输出描述

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

4. C++编码实例


/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file ProxyMode.hpp
* @brief 代理模式
* @autor 写代码的小恐龙er
* @date 2024/01/10
*/

#include<iostream>
#include<string>

using namespace std;

// 抽象主题 -- 买房子的人 和 其代理类的 基类 实现业务方法
class AbstractHome
{
public:
    virtual void BuyInfo() = 0; 
};

// 真实主题 -- 买房子的类
class HomeBuyer : public AbstractHome
{
public:
    void BuyInfo() override{
        std::cout << "YES" << endl;
    }
};

// 【!代理类】 真实类的行为全权由代理类代替
class HomeProxy : public AbstractHome
{
 // 包含真实类的实例化对象
private:
    HomeBuyer *_homeBuyer = nullptr;

// 在创建代理类时 一并创建真实类
public:
    HomeProxy(){
        if(_homeBuyer == nullptr) {
            _homeBuyer = new HomeBuyer();
        }
    }
// 将真实类的各个需求属性放置在代理类种
private:
    int _areaSize = 0;
// 重写真实类的各个行为
public:
    // 一种方法是可以将 判断属性加至代理者的私有属性种 另一种是将其作为参数传入进去
    void SetAreaSize(int size){
        this->_areaSize = size;
    }
    void BuyInfo() override{
        if(_areaSize > 100) _homeBuyer->BuyInfo();
        else std::cout << "NO" << endl;
    }
};

// 客户端代码
int main()
{
    // 输入的房子数量
    int homeNum = 0;
    std::cin >> homeNum;
    
    // 创建代理类
    AbstractHome *buyerAbstractProxy = new HomeProxy();
    
    // 设置代理类 将抽象类向下类型转换
    HomeProxy *homeProxy = dynamic_cast<HomeProxy *>(buyerAbstractProxy);
        
    for(int i = 0; i < homeNum; i++)
    {
        // 房子的面积大小 -- 需要告知给代理 让其做逻辑判断
        int areaSize = 0;
        std::cin >> areaSize;
        
        homeProxy->SetAreaSize(areaSize);
        
        // 开始进行逻辑判断
        homeProxy->BuyInfo();
    }
    
    delete buyerAbstractProxy;
    buyerAbstractProxy = nullptr;
    
    return 0;
}

......

To be continued.文章来源地址https://www.toymoban.com/news/detail-794435.html

到了这里,关于C++ 设计模式之代理模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式之代理模式(静态代理&动态代理)

    目录 1、什么是代理模式 2、代理模式的结构 3、代理模式的实现 3.1 静态代理和动态代理概念 3.2 静态代理 3.3 动态搭理 3.3.1 代码实现 3.3.2 Proxy类讲解 4、动态代理VS静态代理 5、代理模式优缺点 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象

    2024年02月03日
    浏览(32)
  • 设计模式8:代理模式-动态代理

    上一篇:设计模式8:代理模式-静态代理 “动态”的含义是 代码生成代理类,一个代理类可以代理多个接口 。 动态区别于 死板 ,静态代理中一个代理类只能代理一个接口,其他不同的接口,就需要再手写不同的代理类,这就很 死板 。 动态代理类似于在安卓里面,我们常

    2024年02月09日
    浏览(30)
  • 设计模式8:代理模式-静态代理

    我尝试在JDK、Android SDK和一些出名的库中,寻找静态代理的源码,没能找到。如果有读者发现,欢迎评论或者私信我。 1. 售票代理 售票服务 站点售票 代理网点售票 2. 明星代理

    2024年02月11日
    浏览(35)
  • Java设计模式 (三) 代理设计模式

    什么是代理设计模式? 代理设计模式是一种结构型设计模式,它允许创建一个代理对象,用于控制对其他对象的访问。代理模式通常用于在访问对象时添加一些附加操作,而不是直接访问真实对象。代理模式可以在不改变原始类代码的情况下,通过引入代理类来增强功能。 代

    2024年02月12日
    浏览(41)
  • 设计模式|代理模式

    ​代理模式指为其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个对象若不能直接引用另一个对象,而代理对象可以在客户端与目标对象之间起到中介的作用。 普通代理 普通代理模式是指在代理模式中,代理对象和真实对象都实现了相同的接口或继承

    2024年02月04日
    浏览(31)
  • 设计模式--代理模式

    笔记来源:尚硅谷Java设计模式(图解+框架源码剖析) 1)代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即 通过代理对象访问目标对象 2)这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能 3)被代理的对象可以

    2024年02月10日
    浏览(33)
  • 【设计模式】-代理模式

    在软件开发中,经常遇到需要对某个对象进行控制或者监控的场景。而直接修改对象的代码可能使代码变得复杂且难以维护。这时,使用代理模式(Proxy Pattern)可以很好地解决这个问题。          代理模式是一种结构型设计模式, 通过引入一个代理对象来替代原始对象

    2024年02月13日
    浏览(34)
  • 设计模式详解-代理模式

    类型:结构型模式 实现原理:创建具有现有对象的对象 作用:为其他对象提供一种代理以控制对这个对象的访问。 解决的问题:由于对象的访问条件不一,直接访问对象会造成麻烦问题 解决问题的方法:增加中间层。 何时使用:想在访问一个类时做一些控制。 实现核心:

    2024年02月12日
    浏览(36)
  • 设计模式之代理模式

    当我们有对象因为安全性,不能直接对外暴露,或者是需要对对象的操作本身记录日志等信息时就可以考虑使用代理模式, 享元设计模式,包含如下元素: UML图如下: 另外,代理又分为静态代理和动态代理,静态代理就是在编译器已经确定的代理方式,即是硬编码到程序中

    2024年02月16日
    浏览(32)
  • 设计模式二:代理模式

    1、什么是动态代理 可能很多小伙伴首次接触动态代理这个名词的时候,或者是在面试过程中被问到动态代理的时候,不能很好的描述出来,动态代理到底是个什么高大上的技术。不方,其实动态代理的使用非常广泛,例如我们平常使用的 Spring 中的 @Transactional 注解,其依赖

    2024年02月20日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包