// // // // // // // // //
///2013.2.7
// // // // // // // // //
代理这个词,
我们并不陌生。
即使不知道这个Proxy模式,
大概也听过一些关于代理的事。
何谓代理?
彦红先生(不是你想的那个彦红)喝了酒,
不能开车了,
于是打电话给司机雷君(也不是你想的那个雷Jun),
叫他过来给他开下车。
——【代驾】,新华词典里这样概括这件事。
因A不能开车,
于是叫能开车的B代替他开,
这个就是Proxy模式的核心原理。
【核心】A通过B访问C功能(例如开车)。
【UML图】
思想很简单,
但是有一点需要注意,
就是当使用此模式的时候,
一定是在客户端无法直接访问ConcreteSubject的时候,
才需要使用Proxy.
【大致思路】
Proxy通过concreteDriver来实现Drive功能。
p.s. concreteDriver对应UML图中concreteSubject;Drive对应UML图中Subject.
Driver.h
#ifndef _DRIVER_H_
#define _DRIVER_H_
#include<string>
using namespace std;
class Driver
{
public:
Driver(){}
~Driver(){}
virtual string Drive() = 0;
};
class ConcreteDriver: public Driver
{
public:
ConcreteDriver(){}
~ConcreteDriver(){}
string Drive();
};
class Proxy:public Driver
{
public:
Proxy(Driver* dri);
~Proxy(){}
string Drive();
private:
Driver* proxyDriver;
};
#endif
Driver.cpp
#include"Driver.h"
using namespace std;
string ConcreteDriver::Drive()
{
return "is driving the car.";
}
Proxy::Proxy(Driver* dri)
{
this->proxyDriver = dri;
}
string Proxy::Drive()
{
return "Proxy Driver "+proxyDriver->Drive();
}
main.cpp
#include "Driver.h"
#include<iostream>
using namespace std;
int main()
{
Driver* concreteDriver= new ConcreteDriver();
Proxy* proxyDriver = new Proxy(concreteDriver);
cout<<proxyDriver->Drive()<<endl;
return 0;
}
运行结果:
【注意事项】
其实Proxy如果认真分析起来的话,
可以划分为不同种类型。
比如说根据代理实现途径可划分为动态代理与静态代理;
根据实现目的可划分为远程代理,保护代理以及虚代理等。
但正如引言中所说,
本文针对于设计模式的初学者,
故深入不做探讨。
如果有兴趣可参考这篇文章:
http://en.wikipedia.org/wiki/Proxy_pattern
以及此文章底部的Extern Links.