柏虎资源网

专注编程学习,Python、Java、C++ 教程、案例及资源

C++设计模式:用代码演绎武侠世界的绝世神功

"同事写的代码像《九阴真经》,我的却像《辟邪剑谱》——直到我参透了设计模式!" —— 某司CRUD侠的顿悟时刻


一、设计模式:代码江湖的武学秘籍

当if-else嵌套超过三层,当类之间的关系比《甄嬛传》还复杂,你需要一场代码世界的"武学革命"!

菜鸟の痛

 // 传统刀法:硬编码之王  
 void process(int type) {  
     if (type == 1) { /* 降龙十八掌分支 */ }  
     else if (type == 2) { /* 乾坤大挪移分支 */ }  
     // 新增需求:此处应有第108个else if  
 }  

高手の道

 // 策略模式:万剑归宗  
 class Skill {  
 public:  
     virtual void execute() = 0;  
 };  
 void fight(Skill* skill) { skill->execute(); } // 一剑破万法  


二、六大绝学:C++设计模式实战精要

1. 单例模式(Singleton):全球唯一厕所理论

 class ConfigManager {  
 public:  
     static ConfigManager& instance() {  
         static ConfigManager inst; // C++11魔法:线程安全  
         return inst;  
     }  
     // 禁用复制和移动  
     ConfigManager(const ConfigManager&) = delete;  
     void operator=(const ConfigManager&) = delete;  
 private:  
     ConfigManager() = default; // 厕所门私有化  
 };  
 
 // 使用:  
 auto& config = ConfigManager::instance();  

避坑指南

  • 多线程下用std::call_once替代双检锁(C++11前时代的眼泪)
  • 继承单例类?不如直接重写(模板元编程黑科技可破)

2. 工厂模式(Factory):奶茶店流水线哲学

 // 抽象产品  
 class MilkTea {  
 public:  
     virtual void brew() = 0;  
     virtual ~MilkTea() = default;  
 };  
 
 // 具体产品  
 class OolongMT : public MilkTea { /* 冲泡逻辑 */ };  
 class CheeseMT : public MilkTea { /* 奶盖制作 */ };  
 
 // 工厂接口  
 class MTFactory {  
 public:  
     virtual std::unique_ptr<MilkTea> create() = 0;  
 };  
 
 // C++17炫技:自动注册工厂  
 template<typename T>  
 class AutoFactory : public MTFactory {  
 public:  
     std::unique_ptr<MilkTea> create() override {  
         return std::make_unique<T>();  
     }  
 };  
 
 // 使用:  
 AutoFactory<OolongMT> oolongFactory;  
 auto tea = oolongFactory.create();  

3. 观察者模式(Observer):吃瓜群众监听大法

 // 现代C++优雅实现  
 class NewsSubject {  
     std::vector<std::function<void(const string&)>> observers_;  
 public:  
     void addObserver(auto&& func) {  
         observers_.emplace_back(std::forward<decltype(func)>(func));  
     }  
     void notify(const string& news) {  
         for (auto& obs : observers_) obs(news);  
     }  
 };  
 
 // 使用lambda捕获更香  
 subject.addObserver([&](auto news) {  
     cout << "程序员收到八卦:" << news << endl;  
 });  

4. 装饰器模式(Decorator):给代码穿皮肤

 // 抽象武器  
 class Weapon {  
 public:  
     virtual int damage() const = 0;  
 };  
 
 // 具体武器  
 class Sword : public Weapon { /* 基础伤害 */ };  
 
 // 装饰器基类  
 class Enchantment : public Weapon {  
     std::unique_ptr<Weapon> weapon_;  
 public:  
     Enchantment(std::unique_ptr<Weapon> weapon)  
         : weapon_(std::move(weapon)) {}  
     int damage() const override {  
         return weapon_->damage();  
     }  
 };  
 
 // 具体附魔  
 class FireEnchant : public Enchantment {  
 public:  
     using Enchantment::Enchantment;  
     int damage() const override {  
         return Enchantment::damage() + 50; // 火焰附加  
     }  
 };  
 
 // 组合使用:  
 auto weapon = std::make_unique<FireEnchant>(  
     std::make_unique<Sword>()  
 );  


三、设计模式的独孤九剑:破尽万法

模式

应用场景

C++特色实现

适配器

兼容老旧接口

私有继承+using声明

代理

延迟加载/访问控制

运算符重载+智能指针

职责链

请求多级审批

std::function链式调用

访问者

复杂对象结构操作

双重分派+类型擦除



四、走火入魔预警:设计模式的七伤拳

1、过度设计:为了模式而模式,代码复杂度反而飙升

2、性能陷阱:虚函数调用开销在热点路径累积成灾

3、可读性灾难:新人看代码像破译《九阳真经》

4、C++特性冲突:多重继承遇上移动语义,酸爽加倍



五、现代C++的屠龙技

  • CRTP(奇异递归模板):静态多态替代动态多态(零成本抽象)
 template <typename T>  
 class Singleton {  
 protected:  
     Singleton() = default;  
 public:  
     static T& instance() {  
         static T inst;  
         return inst;  
     }  
 };  
 class MyManager : public Singleton<MyManager> { /*...*/ };  
  • 策略模式+lambda:运行时策略切换更丝滑
 void sortData(auto begin, auto end, auto&& compare) {  
     std::sort(begin, end, compare); // C++20的auto参数  
 }  

#C++设计模式 #代码重构 #编程艺术

(温馨提示:掌握设计模式后,请克制重构同事代码的冲动,除非你想接手所有需求!)


灵魂拷问: 当你在代码中看到23种设计模式全用在一个类——

这是架构师的杰作?

还是离职前的行为艺术?

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言