楼主: 1297379890
40 0

[問題求助] C++设计模式之代理模式:以家具生产示例 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

80%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
30 点
帖子
2
精华
0
在线时间
0 小时
注册时间
2018-4-28
最后登录
2018-4-28

楼主
1297379890 发表于 2025-12-10 11:35:56 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

一、代理模式的基本原理

代理模式属于结构型设计模式的一种,其核心在于通过引入一个“代理”对象来间接访问目标对象。在这种结构中,客户端并不直接调用真实业务对象的方法,而是通过代理对象进行通信。代理对象在将请求转发给真实对象前后,可以执行额外的操作,例如权限验证、日志记录、资源预加载等处理流程。

该模式的主要优势体现在两个方面:

  • 解耦客户端与真实对象:将访问控制和辅助功能从核心业务逻辑中剥离,遵循“单一职责原则”,提升模块独立性。
  • 增强系统的可扩展性:无需修改原有代码即可在代理层添加新功能,如监控、缓存或安全检查。

二、家具生产中的代理模式应用分析

在现实的家具制造行业中,许多知名品牌(如“宜居家居”)通常专注于产品设计、市场推广和销售渠道建设,并不亲自参与大规模的生产活动。相反,它们会委托专业的代工厂完成具体的制造任务。这种分工关系恰好映射了软件设计中的代理模式。

以下是该场景中各角色与设计模式元素之间的对应关系:

  • 抽象主题(Subject):定义统一的“家具生产”接口,规范品牌方(客户端)与生产执行方之间的交互方式。
  • 真实主题(RealSubject):指具备实际生产能力的专业实木家具工厂,负责执行切割、组装、打磨等具体工序。
  • 代理(Proxy):即家具代工厂,持有对真实工厂的引用,对外暴露相同的生产接口,同时承担原料审核、进度跟踪、质量抽检等工作。
  • 客户端(Client):代表家具品牌公司,只需向代理提交生产需求,无需了解底层实现细节。
#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;
}

三、基于C++的实现方案(以家具生产为例)

3.1 整体架构设计

采用抽象基类定义公共接口,真实工厂和代理类分别继承该接口,确保两者对外行为一致。代工厂作为代理,在接收到生产请求后,首先执行原材料合规性检查,随后将任务转交真实工厂处理;生产完成后,再由代理发起质量检测流程,体现其在请求流转过程中的控制能力。

IFurnitureProducer

3.2 核心代码实现

所有实现均建立在接口统一的基础上,保证品牌方可通过同一方式调用不同类型的生产单元。代理类内部维护对真实工厂的指针引用,在析构时主动释放资源,防止内存泄漏问题。客户端仅需管理代理实例,简化了资源生命周期的维护工作。

ProduceFurniture
CheckRawMaterial
QualityInspection

四、关键实现要点解析

接口一致性保障机制:无论是真实工厂还是代工厂,都必须实现自同一抽象接口,重写其中的生产方法。这使得客户端能够以多态形式调用,符合“里氏替换原则”,增强了系统的灵活性与可维护性。

代理的附加控制逻辑:代工厂在调用真实生产流程之前执行原料检查操作,在生产结束后触发质量检测流程。这些增强逻辑被封装在代理层,既不影响核心功能,又实现了功能扩展。

资源管理策略:代理对象内含指向真实工厂的指针,在自身销毁时负责清理所持有的资源,避免出现内存泄漏。客户端仅与代理交互,无需关心真实对象的创建与释放,降低了使用复杂度。

五、代理模式的延伸应用场景

在现有基础上,可通过扩展代理类型来应对更复杂的生产管理需求:

  • 虚拟代理:针对大型家具(如整体书柜)生产初始化成本较高的情况,可在代理中延迟创建真实工厂对象,仅当首次接收到订单时才进行实例化,有效节约系统资源。
  • 保护代理:在代理层加入权限校验机制,限制只有经过授权的品牌管理人员才能下达生产指令,防止非法操作。
  • 缓存代理:对于重复下单的常见家具型号,代理可缓存其工艺参数(如尺寸、材料规格),减少重复配置时间,提升整体生产效率。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:furniture producer Produce include Subject
相关内容:C++模式设计

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-20 05:25