代理模式(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;
}
输出: