代理模式
为其他对象提供一种代理以控制这个对象的访问
代理的分类:
- 虚代理(Virtual Proxy) : 创建开销大的对象时,我们将其创建过程交给代理完成。
- 远程代理(Remote Proxy) : 在网络上的对象创建一个局部本地代理,比如要操作网络上一个对象时,通过代理去操作。
- 保护代理(Protection Proxy) : 对对象进行访问控制时,访问权限不足的操作交给代理去操作。
- 智能指针(Smart Pointer) : 当调用真是对象时,我们需要代理额外的处理一些事情。
Proxy模式实现了逻辑和实现的彻底解耦 – 逻辑上使用代理,真正实现在代理中被使用。
代理与被代理者的联系是行为上的代理。
举个栗子: 蓝猫想送一朵花给咖喱,引起不好意思,请菲菲代为送达。此时行为是送花,代理是菲菲,真正的实现是蓝猫。
#include <iostream>
#ifndef _DESIGN_PATTERN_PROXY_PROXY_HPP_
#define _DESIGN_PATTERN_PROXY_PROXY_HPP_
namespace design_pattern
{
class BlueCat
{
public:
void SendFlower()
{
std::cout << "BlueCat : This is give your flowers!" << std::endl;
}
};
class FeiFei
{
BlueCat *pbeproxy_;
public:
FeiFei(BlueCat *ptr) : pbeproxy_(ptr) {}
void SendFlower()
{
pbeproxy_->SendFlower();
}
};
}
#endif // !_DESIGN_PATTERN_PROXY_PROXY_HPP_
//proxy_main.cpp
#include "proxy.hpp"
using namespace design_pattern;
int main()
{
BlueCat b;
FeiFei f(&b);
f.SendFlower();
return 0;
}
装饰者模式与代理模式
相似吗???
相似之处在于,当装饰者模式中Decorator内部的父类指针换成与它同层次的职责类时,两者的类图基本相同。此时,Decorator类似于Proxy,Call类似于BlueCat,Cellphone类似于Flower。
不相似!!!
功能不同,proxy将所有操作都交给内部对象BlueCat来处理。而Decorator的操作,不但承接了子类操作的覆盖,还承接了内部对象的操作。与智能指针的代理颇为相似。