c++之代理模式

代理模式

代理模式属于结构型模式。

定义

代理即一个类代表另一个类的功能。

比如篮球运动员通过经纪人与老板谈薪,那么经纪人就是篮球运动员的代理。

在代理模式中,通过创建一个具有需要代理对象的代理,以便向外界提供需要的功能。

加深理解:

在某些情况下,一个类对象不适合或者不能直接引用另一个类对象,
所以可以交给代理类去完成这个中介的作用,是不是感觉和中介模式有点像。
其实中介模式和代理模式概念是比较接近,但是实际实现却是不同的。

假设有A、B、C三个类,A与B想交流,但是A却因为某种原因,不能直接和B交流
所以需要通过C来代理,而C这个代理其实只封装了A的对象。相当于C就是A的全权代表了。
这个就是代理模式。

中介模式呢,A、B想交流,但是需要通过C来牵线,在C这个类中,封装了A与B的对象。
而代理模式C只封装了A,这就是中介模式和代理模式的不同点。
在现实中,中介模式和买房卖房很像,代理模式和律师帮忙打官司很像。
 

类图:

应用场景:

现在苹果公司需要生产AirPods耳机,委托立讯精密代理生产。

代码:

#include <iostream>
using namespace std;

//抽象工厂
class IFactory
{
public:
	virtual ~IFactory() {}
	virtual void createProduct() = 0;
};

//苹果AirPods耳机工厂
class AppleAirpodsFactory :public IFactory
{
public:
	void createProduct()
	{
		cout << "生产苹果AirPods耳机" << endl;
	}
};

//立讯精密公司代理生产
class ILXCompanyProxy :public IFactory
{
public:
	ILXCompanyProxy(IFactory* f) :m_factory(nullptr)
	{
		m_factory = f;
	}

	void createProduct()
	{
		cout << "立讯精密代理:" << endl;
		m_factory->createProduct();
	}
private:
	IFactory* m_factory;
};

//客户端
int main()
{
	IFactory* factory = new AppleAirpodsFactory;
	ILXCompanyProxy* proxy = new ILXCompanyProxy(factory);

	proxy->createProduct();

	if (factory) delete factory;
	if (proxy) delete proxy;

	getchar();
	return 0;
}

输出:

### C++代理模式的设计与实现 #### 代理模式简介 代理模式是一种结构型设计模式,其主要目的是提供一个替代对象来控制对另一个对象的访问。通过这种方式,可以在不改变原始接口的情况下增强功能或延迟初始化真实对象。 #### 主要组成部分 1. **抽象主题类**:定义客户端使用的公共接口。 2. **真实主题类**:实现了抽象主题中的业务逻辑。 3. **代理类**:持有指向真实主题的对象,并在其基础上扩展额外的功能[^4]。 #### 示例代码展示 下面是一个简单的例子展示了如何利用C++实现基本形式下的代理模式: ```cpp #include <iostream> using namespace std; // 抽象主题类 class Subject { public: virtual ~Subject() {} virtual void request() const = 0; }; // 真实主题类 class RealSubject : public Subject { public: void request() const override { cout << "RealSubject: Handling request." << endl; } }; // 代理类 class Proxy : public Subject { private: RealSubject* real_subject_; public: Proxy(RealSubject* rs):real_subject_(rs){} void request() const override { if (this->check_access()) { this->real_subject_->request(); this->log_access(); } else { cout << "Proxy: Access denied" << endl; } } private: bool check_access() const{ // 这里可以加入权限验证逻辑 return true; } void log_access() const{ cout << "Proxy: Logging the time of request." << endl; } }; int main(){ RealSubject *real_subject = new RealSubject(); Proxy proxy(real_subject); // 客户端应该能够通过代理操作实际的主题对象 proxy.request(); delete real_subject; } ``` 上述程序中`Proxy`作为中介,在执行具体请求之前先进行了访问检查并记录日志信息。这体现了代理模式的核心价值所在——即在不影响原有系统架构的前提下引入新的行为约束机制。 #### 应用场景分析 - 当希望推迟某个昂贵资源实例化过程时可采用虚拟代理; - 对敏感数据的操作实施安全策略则适合使用保护代理; - 若需跨越网络边界处理远程服务调用,则应考虑运用远程代理[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值