一、代理模式核心概念
代理模式是一种结构型设计模式,其核心思想是为目标对象提供一个"代理者",通过代理者控制对目标对象的访问。在这一模式中,客户端不直接与真实业务对象交互,而是通过代理对象间接交互,代理对象可在转发请求前后执行额外逻辑(如权限校验、流程监控、资源预处理等),同时保证客户端与真实对象的接口一致性。
代理模式的核心价值在于:解耦客户端与真实对象 ,将访问控制、辅助逻辑与核心业务逻辑分离,符合"单一职责原则";增强扩展性,可在不修改真实对象和客户端代码的前提下添加新功能。
二、家具生产场景下的代理模式映射
日常家具生产中,知名家具品牌(如"宜居家居")通常专注于设计、品牌运营和渠道销售,不会自建大规模生产基地,而是委托专业代工厂生产产品。此时代工厂就承担了"代理者"的角色,负责对接原料采购、生产执行、质量检测等环节,品牌方只需提出生产需求即可。
该场景与代理模式的角色完美对应:
-
抽象主题(Subject):家具生产者接口,定义"生产家具"的核心行为,统一品牌方(客户端)与生产方(真实对象/代理)的交互标准。
-
真实主题(RealSubject):专业实木家具工厂,具备核心生产能力,负责执行具体的切割、组装、打磨等生产流程。
-
代理(Proxy):家具代工厂,持有真实工厂的引用,对外提供与真实工厂一致的生产接口,同时承担原料审核、生产进度跟踪、质量抽检等辅助工作。
-
客户端(Client):家具品牌方,通过代理(代工厂)下达生产指令,无需关注生产细节。
三、C++代码实现(家具生产场景)
3.1 代码整体结构
采用"抽象类定义接口 + 子类实现"的方式,确保代理与真实对象接口一致。代工厂(代理)在转发生产请求前,先完成原料合规性检查;生产完成后,执行质量检测,体现代理的额外控制逻辑。
3.2 完整代码实现
cpp
#include <iostream>
#include <string>
using namespace std;
// 1. 抽象主题:家具生产者接口(统一生产行为标准)
class IFurnitureProducer {
public:
// 纯虚函数:生产指定类型的家具
virtual void ProduceFurniture(const string& furnitureType) = 0;
// 虚析构函数:确保子类析构时正确释放资源
virtual ~IFurnitureProducer() {}
};
// 2. 真实主题:实木家具工厂(核心生产能力持有者)
class SolidWoodFurnitureFactory : public IFurnitureProducer {
public:
void ProduceFurniture(const string& furnitureType) override {
// 真实生产逻辑:模拟实木家具的生产流程
cout << "[真实工厂] 开始生产 " << furnitureType << endl;
cout << "[真实工厂] 执行流程:原木切割 → 部件组装 → 精细打磨 → 上漆养护" << endl;
cout << "[真实工厂] " << furnitureType << " 生产完成!" << endl;
}
};
// 3. 代理:家具代工厂(控制真实工厂访问,添加辅助逻辑)
class FurnitureAgent : public IFurnitureProducer {
private:
// 持有真实工厂的引用(代理与真实对象关联的关键)
IFurnitureProducer* realFactory;
// 代理的额外逻辑:原料合规性检查
bool CheckRawMaterial(const string& furnitureType) {
cout << "[代工厂] 执行原料检查:为" << furnitureType << "采购北美进口实木" << endl;
cout << "[代工厂] 原料含水率、硬度检测合格,符合生产标准" << endl;
return true;
}
// 代理的额外逻辑:成品质量检测
void QualityInspection(const string& furnitureType) {
cout << "[代工厂] 执行质量检测:" << furnitureType << "结构稳定性、表面平整度检测" << endl;
cout << "[代工厂] 检测合格,粘贴品牌标识" << endl;
}
public:
// 构造函数:初始化真实工厂对象
FurnitureAgent() {
// 代理可自行创建真实工厂,也可通过外部注入(此处简化为内部创建)
realFactory = new SolidWoodFurnitureFactory();
}
// 实现生产接口:转发请求 + 附加逻辑
void ProduceFurniture(const string& furnitureType) override {
// 1. 代理前置逻辑:原料检查
if (!CheckRawMaterial(furnitureType)) {
cout << "[代工厂] 原料不合格,终止生产" << endl;
return;
}
// 2. 转发请求到真实工厂:执行核心生产
realFactory->ProduceFurniture(furnitureType);
// 3. 代理后置逻辑:质量检测
QualityInspection(furnitureType);
}
// 析构函数:释放真实工厂资源
~FurnitureAgent() {
delete realFactory;
realFactory = nullptr;
}
};
// 4. 客户端:家具品牌方(通过代理访问生产能力)
int main() {
// 品牌方只与代理(代工厂)交互,无需感知真实工厂
IFurnitureProducer* agent = new FurnitureAgent();
// 品牌方下达生产指令:实木餐桌
cout << "=== 品牌方下达生产指令:实木餐桌 ===" << endl;
agent->ProduceFurniture("实木餐桌");
// 品牌方下达生产指令:实木衣柜
cout << "\n=== 品牌方下达生产指令:实木衣柜 ===" << endl;
agent->ProduceFurniture("实木衣柜");
// 释放代理资源
delete agent;
agent = nullptr;
return 0;
}
四、代码说明
-
接口一致性保障 :真实工厂和代工厂均继承自
IFurnitureProducer接口,重写ProduceFurniture方法,确保品牌方(客户端)可通过统一接口调用生产能力,符合"里氏替换原则"。 -
代理的控制作用 :代工厂在转发生产请求前执行
CheckRawMaterial(原料检查),生产后执行QualityInspection(质量检测),这些辅助逻辑与真实生产逻辑分离,体现代理模式的核心价值。 -
资源管理:代理类内部持有真实工厂指针,在析构时释放资源,避免内存泄漏;客户端仅需管理代理对象,简化资源维护。
五、代理模式在家具生产中的扩展场景
基于上述代码可轻松扩展不同类型的代理,适配更复杂的生产需求:
-
虚拟代理:若真实工厂生产大型家具(如整体书柜)时初始化成本高,可在代理中延迟创建真实工厂,仅当首次收到生产指令时才初始化,减少资源浪费。
-
保护代理:为代理添加权限控制逻辑,仅允许品牌方指定的授权人员下达生产指令,防止未授权访问。
-
缓存代理:若品牌方频繁下单相同类型家具,代理可缓存真实工厂的生产参数(如尺寸、工艺),提高生产效率。