C++设计模式之代理模式:以家具生产示例

一、代理模式核心概念

代理模式是一种结构型设计模式,其核心思想是为目标对象提供一个"代理者",通过代理者控制对目标对象的访问。在这一模式中,客户端不直接与真实业务对象交互,而是通过代理对象间接交互,代理对象可在转发请求前后执行额外逻辑(如权限校验、流程监控、资源预处理等),同时保证客户端与真实对象的接口一致性。

代理模式的核心价值在于:解耦客户端与真实对象 ,将访问控制、辅助逻辑与核心业务逻辑分离,符合"单一职责原则";增强扩展性,可在不修改真实对象和客户端代码的前提下添加新功能。

二、家具生产场景下的代理模式映射

日常家具生产中,知名家具品牌(如"宜居家居")通常专注于设计、品牌运营和渠道销售,不会自建大规模生产基地,而是委托专业代工厂生产产品。此时代工厂就承担了"代理者"的角色,负责对接原料采购、生产执行、质量检测等环节,品牌方只需提出生产需求即可。

该场景与代理模式的角色完美对应:

  • 抽象主题(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;
}

四、代码说明

  1. 接口一致性保障 :真实工厂和代工厂均继承自IFurnitureProducer接口,重写ProduceFurniture方法,确保品牌方(客户端)可通过统一接口调用生产能力,符合"里氏替换原则"。

  2. 代理的控制作用 :代工厂在转发生产请求前执行CheckRawMaterial(原料检查),生产后执行QualityInspection(质量检测),这些辅助逻辑与真实生产逻辑分离,体现代理模式的核心价值。

  3. 资源管理:代理类内部持有真实工厂指针,在析构时释放资源,避免内存泄漏;客户端仅需管理代理对象,简化资源维护。

五、代理模式在家具生产中的扩展场景

基于上述代码可轻松扩展不同类型的代理,适配更复杂的生产需求:

  • 虚拟代理:若真实工厂生产大型家具(如整体书柜)时初始化成本高,可在代理中延迟创建真实工厂,仅当首次收到生产指令时才初始化,减少资源浪费。

  • 保护代理:为代理添加权限控制逻辑,仅允许品牌方指定的授权人员下达生产指令,防止未授权访问。

  • 缓存代理:若品牌方频繁下单相同类型家具,代理可缓存真实工厂的生产参数(如尺寸、工艺),提高生产效率。

相关推荐
ZouZou老师2 小时前
C++设计模式之适配器模式:以家具生产为例
java·设计模式·适配器模式
小小晓.2 小时前
Pinely Round 4 (Div. 1 + Div. 2)
c++·算法
SHOJYS2 小时前
学习离线处理 [CSP-J 2022 山东] 部署
数据结构·c++·学习·算法
steins_甲乙3 小时前
C++并发编程(3)——资源竞争下的安全栈
开发语言·c++·安全
煤球王子3 小时前
学而时习之:C++中的异常处理2
c++
仰泳的熊猫4 小时前
1084 Broken Keyboard
数据结构·c++·算法·pat考试
我不会插花弄玉4 小时前
C++的内存管理【由浅入深-C++】
c++
CSDN_RTKLIB4 小时前
代码指令与属性配置
开发语言·c++
上不如老下不如小4 小时前
2025年第七届全国高校计算机能力挑战赛 决赛 C++组 编程题汇总
开发语言·c++
雍凉明月夜4 小时前
c++ 精学笔记记录Ⅱ
开发语言·c++·笔记·vscode