23种设计模式之十二(结构型模式)Proxy模式

一、简介

        至少在以下集中情况下可以用 Proxy 代理模式解决问题:

(1)创建开销大的对象时候如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF 称之为虚代理(Virtual Proxy)。

(2)为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成,GoF 称之为远程代理(Remote Proxy)。

(3)对对象进行控制访问的时候,如在论坛中不同权限的用户如管理员、普通用户等将获得不同层次的操作权限,们将这个工作交给一个代理去完成,GoF 称之为保护代理(Protection Proxy)。

(4)智能指针(Smart Pointer)。

        Proxy 模式典型的结构图为:

       Proxy的Request 请求实际上是交给了ConcreteSubject来实际执行。

二、详解

1、代码实现

(1)代码proxy.h:

#ifndef _PROXY_H_
#define _PROXY_H_

class Subject;
//定义代理类
class Proxy
{
	  public:
	  	  Proxy();
	  	  Proxy(Subject *sub);
	  	  ~Proxy();
	  	  void Request();
	  protected:
	  private:
	  	  Subject *_sub;
};

class Subject
{
		public:
			  virtual ~Subject();
			  virtual void Request() = 0;
	  protected:
	  	  Subject();
	  private:
};

class ConcreteSubject : public Subject
{
		public:
			  ConcreteSubject();
			  ~ConcreteSubject();
			  void Request();
	  protected:
	  private:
};

#endif

(2)代码proxy.cpp:

#include <iostream>
#include "proxy.h"
using namespace std;

Proxy::Proxy()
{
}

Proxy::Proxy(Subject *sub)
{
	 _sub = sub; 
}

Proxy::~Proxy()
{
	  if (_sub) delete _sub;
}

void Proxy::Request()
{
	  cout<<"---Proxy Request..."<<endl;
	  _sub->Request();
}

Subject::Subject()
{
}

Subject::~Subject()
{
}

ConcreteSubject::ConcreteSubject()
{
}

ConcreteSubject::~ConcreteSubject()
{
}

void ConcreteSubject::Request()
{
	  cout<<"ConcreteSubject::Request..."<<endl;
}
(3)代码main.cpp:
#include <iostream>
#include "proxy.h"
using namespace std;

int main()
{
	  Subject *sub = new ConcreteSubject();
	  Proxy *p = new Proxy(sub);
	  p->Request();
	  
	  
	  return 0;
}
(4)makefile:
CFLAGS = -g
DEFINED = #-D _VERSION
LIBS = 
CC = g++
INCLUDES = -I./
OBJS= main.o proxy.o
TARGET= main
all:$(TARGET)

$(TARGET):$(OBJS)
	$(CC) $(CFLAGS) -o $@ $(OBJS)

.SUFFIXES:.o .h
.SUFFIXES:.cpp .o
.cpp.o:
	$(CC) $(DEFINED) -c $(CFLAGS) -o $@ $<

ok:
	./$(TARGET)
clean:
	rm -f $(OBJS) $(TARGET) core *.log

2、运行结果

(Centos6.3系统中运行结果:)


三、总结

(1)Proxy代理模式为其他对象提供一种代理以控制对这个对象的访问,其最大的好处就是实现了逻辑和实现的彻底解耦。

(2)源码已经打包上传到csdn上可登录下载(http://download.csdn.net/detail/taiyang1987912/8422097)。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值