现在的位置: 首页 > 综合 > 正文

【2013.2.7】无法显示此网页,错误404——Proxy

2018年02月19日 ⁄ 综合 ⁄ 共 1361字 ⁄ 字号 评论关闭

// // // // // // // // //

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

抱歉!评论已关闭.