// // // // // // // // //
///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.