C++设计模式——代理模式(proxy pattern)

一、原理讲解

代理模式也可以称作为委托,对对象的业务的委托。

1.1意图

为其它对象提供一种代理,以控制对这个对象的访问。

1.2应用场景

1.2.1远程代理(remote proxy)

  • 为一个对象在不同的地址空间提供局部代表;

1.2.2虚代理(virtual proxy)

  • 根据需要创建开销很大的对象;

1.2.3保护代理(protection proxy)

  • 控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候;

1.2.4智能引用(smart reference)

  • 对指向实际对象的引用计数器,这样当该对象没有引用时,可以自动释放它;
  • 当第一次引用一个持久对象时,将它装入内存;
  • 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它;

1.3结构图(UML图)

C++设计模式——代理模式(proxy pattern)_第1张图片

1.4代码实现步骤

a1 定义一个主题接口类ISubject,定义一个接口函数request();
a2 定义一个真实主题类RealSubject,实现接口函数request();
a3 定义一个代理类(或者称为委托类)Proxy,实现接口函数request(),并且在该函数内调用具体类RealSubject业务逻辑功能函数RealSubject::request()实现对具体类RealSubject对象的业务逻辑功能代理和访问权限控制;

二、实现代码

ProxyPattern.cpp

#include 

using namespace std;

#define DELETE(pointer) delete pointer; pointer=nullptr

class ISubject
{
public:
	virtual ~ISubject() {}

	virtual void request() = 0;
};

class RealSubject : public ISubject
{
public:
	virtual void request() override { cout << "RealSubject::request()!" << endl; }
};

class Proxy : public ISubject
{
public:
	Proxy() { subject = new RealSubject(); }
	~Proxy() { DELETE(subject); }

	void request() override {
		cout << "begin proxy!" << endl;
		subject->request();
		cout << "end proxy!" << endl;
	}

private:
	ISubject *subject;
};

void doProxyPattern()
{	
	Proxy *proxy = new Proxy();
	proxy->request();
	DELETE(proxy);
}

mian.cpp

#include 

extern void doProxyPattern();

int main()
{
	doProxyPattern();

	system("pause");
	return 1;
}

C++设计模式——代理模式(proxy pattern)_第2张图片

三、总结

代理模式也可以称为委托模式,主要优点实现了业务功能(RealSubject::request())和业务逻辑分离(Proxy::request()),缺点是通过第三方类来调用逻辑复杂,调用出错的话可能会产生其它意外错误。也就是说,代理模式的优点,恰恰也是其缺点。

四、参考内容

设计模式之代理模式(C++)
https://www.cnblogs.com/lang5230/p/5322668.html
陈建忠设计模式(参考:哔哩哔哩C++设计模式!!!)
Erich Gamma,Richard Helm.《设计模式 可复用面向对象软件的基础》[M].机械工业出版社,2019:

你可能感兴趣的:(设计模式,c++,代理模式,proxy,pattern)