突破编程_C++_设计模式(代理模式)-2 代理模式的实现步骤

时间:2024-03-08 15:37:19

在 C++ 中实现代理模式通常涉及以下步骤:

(1)定义接口
首先,需要定义一个接口(或者抽象类),该接口定义了代理类和被代理类必须实现的共同方法。这个接口定义了代理模式的公共契约,确保客户端代码能够统一地与代理类和被代理类交互。

(2)创建被代理类
接下来,需要创建被代理类(Real Subject),这个类实现了在第一步中定义的接口。被代理类是实际执行功能的类,它包含了客户端需要的实际业务逻辑。

(3)创建代理类
然后,需要创建代理类(Proxy)。代理类同样实现了第一步中定义的接口。在代理类的方法中,可以添加额外的逻辑或控制。这些额外的逻辑可以是在调用被代理类方法之前、之后,或者替代被代理类方法的逻辑。

(4)实现代理逻辑
在代理类中,需要持有对被代理类的引用或指针。当客户端调用代理类的方法时,代理类可以根据需要决定是直接执行被代理类的方法,还是在执行前后添加额外的逻辑。

(5)使用代理
最后,客户端代码通过代理类与被代理类交互。客户端不需要知道代理类的存在,它只需要关心接口定义的方法。代理类负责在客户端和被代理类之间传递请求,并在必要时添加额外的逻辑或控制。

下面是一个简单的代理模式实现示例:

首先是接口定义:

#include <iostream>
#include <memory>

class ISubject {
public:
	virtual ~ISubject() = default;
	virtual void Request() = 0; // 纯虚函数,要求实现类提供具体实现  
};

接着是被代理类:

class RealSubject : public ISubject {
public:
	void Request() override {
		// 实现具体的业务逻辑  
		std::cout << "RealSubject::Request() is called." << std::endl;
	}
};

然后是代理类:

class ProxySubject : public ISubject 
{
public:
	ProxySubject() : realSubject(std::make_shared<RealSubject>()) {}
	~ProxySubject() { ; }

	void Request() override {
		// 在调用被代理类的方法前后添加额外的逻辑  
		std::cout << "ProxySubject::BeforeRequest()" << std::endl;
		realSubject->Request();
		std::cout << "ProxySubject::AfterRequest()" << std::endl;
	}
private:
	std::shared_ptr<RealSubject> realSubject; // 持有对被代理类的引用  
};

最后是客户端代码:

int main() 
{
	std::shared_ptr<ISubject> subject = std::make_shared<ProxySubject>(); // 客户端通过代理类与被代理类交互  
	subject->Request(); // 调用代理类的方法  

	return 0;
}

上面代码的输出为:

ProxySubject::BeforeRequest()
RealSubject::Request() is called.
ProxySubject::AfterRequest()

在上面代码中,ISubject 是一个接口,定义了 Request 方法。RealSubject 是实现了 ISubject 接口的被代理类,它提供了 Request 方法的具体实现。ProxySubject 是代理类,它同样实现了 ISubject 接口,并在其 Request 方法中添加了额外的逻辑,如打印一些信息。

客户端代码通过 ProxySubject 类型的指针调用 Request 方法,代理类在调用被代理类的方法前后输出了额外的信息。