代理模式(Proxy)

1、作用

代理模式是包装一个对象,控制对它的访问,实现逻辑合实现的解耦。

2、实现方式

代理模式跟装饰器模式、适配器模式、外观模式都有类似的地方,都通过关联关系封装了其他类型的对象,但是使用的目的不一样。

代理:包装一个对象,控制对它的访问。
装饰者:包装另一个对象,并提供额外的行为。
适配器:包装另一个对象,并提供不同的接口。
外观:包装许多对象,以简化他们的接口。

代理模式和装饰器模式最为相似

            (1)、UML图基本一样,共同的基类提供统一的接口,然后分出两部分子类,被封装类(被装饰类,被代理类)的和封装类(装饰器类、代理类),这两个类是关联关系。

他们主要有三点不同。

           (1)、目的不一样:代理模式关注与被代理对象行为的控制,然而装饰模式关注于在一个对象上动态的添加方法。

           (2)、对象绑定时刻不一样:代理模式中,代理类中默认封装了一个被代理的对象,例化代理类的时候不需要通过构造函数传递被代理对象,代理和被代理对象是在代理类中固定绑定。而装饰器模式中装饰器类例化的时候需要传递一个被装饰的对象,装饰对象与装饰器由用户绑定。

           (3)、对应数量不一样:代理类和被代理的对象一般是一一对应,而装饰器类和被装饰对象一般是多对一,这样导致装饰器类会中间定义一个装饰器基类,专门封装被装饰对象。

下面以买房代理为例子,对应的UML图为如下:

3、C++代码

BuyHouseProxy.h

#include <iostream>

#ifndef __BUY_HOUSE_PROXY__H__
#define __BUY_HOUSE_PROXY__H__

using namespace std;

class Buy {
    virtual void buy(int price) = 0;
};

class BuyHouse : public Buy {
    public:
        void buy(int price) { cout<<"buy house is success! price is "<<price<<endl; }
};

class BuyHouseProxy : public Buy {
    public:
        void buy(int price) {
            if(price >= 10)                         // 控制被代理对象
                buyHouse.buy(price);
            else
                cout<<"price is to low !" <<endl;
        }
    private:
        BuyHouse buyHouse;
};


#endif

test.cc

#include "BuyHouseProxy.h"

int main() {
    BuyHouseProxy buyHouseProxy;
    buyHouseProxy.buy(9);
    buyHouseProxy.buy(10);

    return 0;
}

输出:

原文地址:https://www.cnblogs.com/yuandonghua/p/11890610.html