"同事写的代码像《九阴真经》,我的却像《辟邪剑谱》——直到我参透了设计模式!" —— 某司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种设计模式全用在一个类——
这是架构师的杰作?
还是离职前的行为艺术?