导读:本期聚焦于小伙伴创作的《C++框架中设计模式如何实现灵活组合策略》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++框架中设计模式如何实现灵活组合策略》有用,将其分享出去将是对创作者最好的鼓励。

在C++框架的开发过程中,单一设计模式往往只能解决特定维度的开发问题,面对复杂的业务场景和框架扩展需求,将多个设计模式按照合理的逻辑进行组合,才能最大化发挥设计模式的优势,降低模块间的耦合度,提升代码的可维护性和扩展性。

C++框架中设计模式如何实现灵活组合策略

常用设计模式组合场景

单例模式与工厂模式组合

单例模式可以保证某个类全局只有一个实例,工厂模式负责对象的创建逻辑封装,两者组合可以实现全局统一的对象创建管理,避免重复创建无状态的管理类实例。

下面是组合实现的示例代码:

#include <iostream>
#include <memory>
#include <unordered_map>

// 抽象产品类
class Product {
public:
    virtual void use() = 0;
    virtual ~Product() = default;
};

// 具体产品A
class ProductA : public Product {
public:
    void use() override {
        std::cout << "使用产品A" << std::endl;
    }
};

// 具体产品B
class ProductB : public Product {
public:
    void use() override {
        std::cout << "使用产品B" << std::endl;
    }
};

// 单例工厂类
class ProductFactory {
private:
    // 私有构造函数,保证单例
    ProductFactory() = default;
    // 存储产品创建函数的映射
    std::unordered_map<std::string, std::function<std::shared_ptr<Product>()>> creators;

public:
    // 获取单例实例
    static ProductFactory& getInstance() {
        static ProductFactory instance;
        return instance;
    }

    // 注册产品创建函数
    void registerProduct(const std::string& type, std::function<std::shared_ptr<Product>()> creator) {
        creators[type] = creator;
    }

    // 创建产品
    std::shared_ptr<Product> createProduct(const std::string& type) {
        auto it = creators.find(type);
        if (it != creators.end()) {
            return it->second();
        }
        return nullptr;
    }

    // 禁止拷贝和赋值
    ProductFactory(const ProductFactory&) = delete;
    ProductFactory& operator=(const ProductFactory&) = delete;
};

int main() {
    // 注册产品
    ProductFactory::getInstance().registerProduct("A", []() {
        return std::make_shared<ProductA>();
    });
    ProductFactory::getInstance().registerProduct("B", []() {
        return std::make_shared<ProductB>();
    });

    // 创建并使用产品
    auto productA = ProductFactory::getInstance().createProduct("A");
    if (productA) {
        productA->use();
    }
    auto productB = ProductFactory::getInstance().createProduct("B");
    if (productB) {
        productB->use();
    }
    return 0;
}

观察者模式与策略模式组合

观察者模式用于实现对象间的消息通知,策略模式用于封装不同的算法逻辑,两者组合可以实现不同场景下动态切换通知处理逻辑,同时保证通知者和处理逻辑的解耦。

实现示例如下:

#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>

// 通知策略接口
class NotifyStrategy {
public:
    virtual void notify(const std::string& msg) = 0;
    virtual ~NotifyStrategy() = default;
};

// 控制台通知策略
class ConsoleNotifyStrategy : public NotifyStrategy {
public:
    void notify(const std::string& msg) override {
        std::cout << "控制台通知: " << msg << std::endl;
    }
};

// 文件通知策略
class FileNotifyStrategy : public NotifyStrategy {
public:
    void notify(const std::string& msg) override {
        std::cout << "文件通知: " << msg << std::endl;
    }
};

// 观察者抽象类
class Observer {
public:
    virtual void update(const std::string& msg) = 0;
    virtual ~Observer() = default;
};

// 具体观察者,持有通知策略
class ConcreteObserver : public Observer {
private:
    std::shared_ptr<NotifyStrategy> strategy;
public:
    ConcreteObserver(std::shared_ptr<NotifyStrategy> s) : strategy(s) {}
    void update(const std::string& msg) override {
        if (strategy) {
            strategy->notify(msg);
        }
    }
    // 动态切换通知策略
    void setStrategy(std::shared_ptr<NotifyStrategy> s) {
        strategy = s;
    }
};

// 被观察者类
class Subject {
private:
    std::vector<std::shared_ptr<Observer>> observers;
public:
    void attach(std::shared_ptr<Observer> observer) {
        observers.push_back(observer);
    }
    void detach(std::shared_ptr<Observer> observer) {
        observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    }
    void notifyAll(const std::string& msg) {
        for (auto& observer : observers) {
            observer->update(msg);
        }
    }
};

int main() {
    Subject subject;
    auto consoleStrategy = std::make_shared<ConsoleNotifyStrategy>();
    auto fileStrategy = std::make_shared<FileNotifyStrategy>();
    auto observer1 = std::make_shared<ConcreteObserver>(consoleStrategy);
    auto observer2 = std::make_shared<ConcreteObserver>(fileStrategy);

    subject.attach(observer1);
    subject.attach(observer2);
    subject.notifyAll("框架初始化完成");

    // 动态切换observer1的通知策略
    observer1->setStrategy(fileStrategy);
    subject.notifyAll("框架配置更新");
    return 0;
}

设计模式组合的核心原则

  • 职责单一原则:每个设计模式只负责解决自身对应的设计问题,组合时不要强行让某个模式承担额外的职责,避免逻辑混乱。
  • 松耦合原则:组合后的模式之间尽量通过接口交互,避免直接依赖具体实现类,保证后续可以灵活替换某个模式的具体实现。
  • 避免过度设计:不要为了组合而组合,只有当单一模式无法满足需求时再考虑组合,避免引入不必要的复杂度。

组合时的注意事项

在C++框架中组合设计模式时,需要注意内存管理问题,尤其是使用裸指针时容易出现内存泄漏或者悬垂指针,建议优先使用智能指针管理对象生命周期。另外,组合后的代码逻辑需要添加清晰的注释,说明每个模式的作用和组合的逻辑,方便后续维护。如果组合的模式较多,建议将不同模式的实现拆分到不同的模块中,避免单个类的职责过重。

C++框架设计模式组合策略面向对象设计修改时间:2026-07-20 22:27:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。