代理模式(Proxy)

代理模式(Proxy)

1、作用

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

2、实现方式

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

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

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

他们主要有三点不同。

(1)、目的不一样:代理模式关注与被代理对象行为的控制,然而装饰模式关注于在一个对象上动态的添加方法。
(2)、对象绑定时刻不一样:代理模式中,代理类中默认封装了一个被代理的对象,例化代理类的时候不需要通过构造函数传递被代理对象,代理和被代理对象是在代理类中固定绑定。而装饰器模式中装饰器类例化的时候需要传递一个被装饰的对象,装饰对象与装饰器由用户绑定。
(3)、对应数量不一样:代理类和被代理的对象一般是一一对应,而装饰器类和被装饰对象一般是多对一,这样导致装饰器类会中间定义一个装饰器基类,专门封装被装饰对象。

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

img

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;
}

输出:
img

posted @   下夕阳  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示