设计模式12、代理模式 Proxy

解释说明:代理模式(Proxy Pattern)为其他对象提供了一种代理,以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

抽象主题(Subject):通过接口或抽象类声明真实主题和代理对象事项的业务方法
真实主题(RealSubject):实现了抽象主题中额具体业务,是代理对象所代表的真实对象,是最终要引用的对象
代理(Proxy):提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能
优点:
代理模式能将代理对象与真正被调用的对象分离,在一定程度上降低了系统的耦合度。
在客户端和目标对象之间,代理起到一个中介作用,这样可以保护目标对象。在对目标对象调用之前,代理对象也可以进行其他操作。
缺点:
这种模式引入了另一个抽象层,这有时可能是一个问题。如果真实主题被某些客户端直接访问,并且其中一些客户端可能访问代理类,这可能会导致不同的行为。
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
实现代理模式需要额外的工作,有些代理模式的实现非常复杂
适用场景
根据目的和实现方式的不同,代理模式可分为很多种,常见的有:
远程代理(Remote Proxy)
为一个位于不同地址空间的对象提供一个本地代理,对代理的方法调用会导致对远程对象的方法调用。ATM 就是一个例子,ATM 可能会持有(存在于远程服务器中的)银行信息的一个代理对象。
虚拟代理(Virtual Proxy)
使用虚拟代理,代理可以作为一个(资源消耗较大的)对象的代表。虚拟代理经常延迟对象的创建,直到需要为止。在创建对象之前(及创建对象过程中),虚拟代理也可以作为对象的代理;之后,代理将请求直接委托给 RealSubject。
保护代理(Protection Proxy)
根据访问权限,可以使用保护代理来控制对资源的访问。例如,有一个员工对象,保护代理可以允许普通员工调用对象的某些方法,管理员调用其他方法。
缓冲代理(Cache Proxy)
为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
智能引用代理(Smart Reference Proxy)
当一个对象被引用时,提供一些额外的操作(例如:将对象被调用的次数记录下来)。

cpp 复制代码
#pragma once
#include <iostream>
// 电信运营商
class ITelco
{
public:
       virtual ~ITelco() {}
       virtual void Recharge(int money) = 0;  // 充值
};
// 中国移动
class CMCC : public ITelco
{
public:
    void Recharge(int money) override {
        std::cout << "Recharge " << money;
    }
};
// 代理点
class Proxy : public ITelco
{
public:
    Proxy() : m_pCMCC(NULL) {}
    ~Proxy() { delete m_pCMCC; }
    // 低于 50 不充
    void Recharge(int money) override {
        if (money >= 50) {
            if (m_pCMCC == NULL)
                m_pCMCC = new CMCC();
            m_pCMCC->Recharge(money);
        }
        else {
            std::cout << "Sorry, too little money" << std::endl;
        }
    }
private:
    CMCC* m_pCMCC;
};

#include "subject.h"
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
int main()
{
       Proxy* proxy = new Proxy();
       proxy->Recharge(20);
       proxy->Recharge(100);
       SAFE_DELETE(proxy);
       getchar();
       return 0;
}
相关推荐
牛奶咖啡138 小时前
学习设计模式《十三》——迭代器模式
设计模式·迭代器模式·内部迭代器和外部迭代器·带迭代策略的迭代器·双向迭代器·迭代器模式的优点·何时选用迭代器模式
哆啦A梦的口袋呀8 小时前
设计模式汇总
python·设计模式
在未来等你11 小时前
设计模式精讲 Day 1:单例模式(Singleton Pattern)
java·设计模式·面向对象·软件架构
不会编程的小江江11 小时前
【设计模式】单例模式
单例模式·设计模式
哆啦A梦的口袋呀17 小时前
基于Python学习《Head First设计模式》第十一章 代理模式
学习·设计模式·代理模式
Dave_Young18 小时前
上位机开发中的设计模式(3):装饰器模式
设计模式·装饰器模式
缘友一世20 小时前
java设计模式[2]之创建型模式
java·开发语言·设计模式
秋田君1 天前
深入理解JavaScript设计模式之策略模式
javascript·设计模式·策略模式
不会编程的小江江1 天前
【设计模式】UML类图与工厂模式
c++·设计模式
lpfasd1231 天前
备忘录模式(Memento Pattern)
java·设计模式·备忘录模式