设计模式:代理模式 Proxy

目录


代理是一种结构型设计模式,让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。


问题

为什么要控制对于某个对象的访问呢? 举个例子: 有这样一个消耗大量系统资源的巨型对象,你只是偶尔需要使用它,并非总是需要。

你可以实现延迟初始化: 在实际有需要时再创建该对象。 对象的所有客户端都要执行延迟初始代码。 不幸的是, 这很可能会带来很多重复代码。

在理想情况下, 我们希望将代码直接放入对象的类中, 但这并非总是能实现:比如类可能是第三方封闭库的一部分。

解决方案

代理模式建议新建一个与原服务对象接口相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。 代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。

这有什么好处呢? 如果需要在类的主要业务逻辑前后执行一些工作, 你无需修改类就能完成这项工作。 由于代理实现的接口与原类相同, 因此你可将其传递给任何一个使用实际服务对象的客户端。

结构

代码

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

class ServiceInterface{
public:
    virtual void operation()=0;
    virtual ~ServiceInterface(){}
};
class Service:public ServiceInterface{
public:
    void operation(){
        cout<<"真实服务的操作 \n";
    }
};
class Proxy:public ServiceInterface{
public:
    Proxy(shared_ptr<Service> realService):m_realService(realService){}
    bool checkAcess(){
        cout<<"检查访问权限 \n";
        return true;
    }
    void operation(){
        if(checkAcess()){
            m_realService->operation();
        }
    }
private:
    shared_ptr<Service> m_realService;
};

int main(){
    auto realService=make_shared<Service>();
    cout<<"---真实服务操作"<<endl;
    realService->operation();

    auto proxy=make_shared<Proxy>(realService);
    cout<<"---代理服务操作"<<endl;
    proxy->operation();
    return 0;
}
相关推荐
艺艺生辉15 小时前
从if-else到策略模式
后端·设计模式
小林ixn15 小时前
单例模式:从弹窗管理到全局状态,一个模式搞定
前端·javascript·设计模式
AI人工智能+电脑小能手17 小时前
大白话说Java设计模式-17-装饰器模式(源码剖析篇)
java·spring·设计模式·装饰器模式·源码分析·io流
workflower19 小时前
案例 :某交通厅基于AI技术的智能安全运营实践
网络·人工智能·安全·设计模式·机器人
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-16-装饰器模式(业务实战篇)
java·设计模式·装饰器模式·功能扩展·动态增强
workflower2 天前
例二:某汽车制造企业深度融合AI智能体,构建园区网络的智能运维体系
人工智能·机器学习·设计模式·机器人·云计算·汽车·制造
ly76892 天前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接
略略略咯咯2 天前
(总结)设计模式
设计模式
Cosolar3 天前
DeepSeek Harness 理解 Harness 的设计哲学 - 可组合的插件运行时
人工智能·设计模式·架构