23种设计模式示例
23种设计模式示例
设计模式是解决软件设计中常见问题的可复用方案,分为三大类:创建型模式(5种)关注对象的高效创建与初始化,如单例、工厂;结构型模式(7种)处理对象间的组合与接口适配,如代理、装饰器;行为型模式(11种)管理对象间的通信与协作,如观察者、策略。这些模式通过解耦代码、提高复用性和增强扩展性,帮助开发者构建灵活、可维护的系统,例如通过适配器整合旧接口,利用责任链处理多级请求,或通过状态模式实现行为动态切换,是应对复杂软件架构挑战的经典工具箱。
创建型(5种)
1. 单例模式(Singleton)
场景:全局配置管理、日志记录器、数据库连接池
懒汉式单例: 单例在第一次获取实例的时候才实例化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <utility>
template<class T>
class Singleton {
protected:
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton &) = delete;
Singleton &operator=(const Singleton &) = delete;
public:
template<typename... Args>
static T &instance(Args &&...args) {
static T obj(std::forward<Args>(args)...);
return obj;
}
};
#include <iostream>
#include <string>
class MyClass {
public:
void say_hello() {
std::cout << "Hello" << std::endl;
}
}
int main() {
auto &my_class = Singleton<MyClass>::instance();
my_class.say_hello();
// 也可以使用 MyClass 直接继承 Singleton 来使用
// auto my_class = MyClass::instance();
// my_class.say_hello();
}
饿汉式单例: 单例在进入 main 函数之前就已经实例化了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <memory>
#include <mutex>
#include <string>
template<class T>
class Singleton {
protected:
static std::unique_ptr<T> m_instance;
static std::once_flag m_flag; // 保证多线程调用时只make_unique一次
protected:
Singleton() = default;
~Singleton() = default;
public:
template<typename... Args>
static std::unique_ptr<T> &instance(Args &&...args) {
std::call_once(m_flag, [&]() {
m_instance = std::make_unique<T>(std::forward<Args>(args)...);
});
return m_instance;
}
Singleton(const Singleton &) = delete;
Singleton &operator=(const Singleton &) = delete;
};
template<class T>
std::unique_ptr<T> Singleton<T>::m_instance = nullptr;
template<class T>
std::once_flag Singleton<T>::m_flag;
class Person : public Singleton<Person> {
public:
Person(const std::string &name, int age)
:m_name(name)
,m_age(age) {
}
void show_info() {
std::cout << "姓名: " << m_name << std::endl;
std::cout << "年龄: " << m_age << std::endl;
}
private:
std::string m_name;
int m_age;
};
int main() {
Person::instance("xxx", 15)->show_info();
return 0;
}
2. 工厂方法模式(Factory Method)
场景:跨平台文件系统处理、文档格式转换器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
// 产品接口
class Document {
public:
virtual void Open() = 0;
virtual ~Document() {}
};
class TextDocument : public Document {
public:
void Open() override {
std::cout << "Opening text document" << std::endl;
}
};
// 创建者抽象类
class Application {
public:
virtual Document* CreateDocument() = 0;
void NewDocument() {
Document* doc = CreateDocument();
doc->Open();
delete doc;
}
};
class TextApplication : public Application {
public:
Document* CreateDocument() override {
return new TextDocument();
}
};
int main() {
Application* app = new TextApplication();
app->NewDocument(); // Output: Opening text document
delete app;
return 0;
}
3. 抽象工厂模式(Abstract Factory)
场景:跨平台UI组件、游戏装备套装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
// 抽象产品
class Button {
public:
virtual void Paint() = 0;
virtual ~Button() {}
};
class WinButton : public Button {
public:
void Paint() override {
std::cout << "Windows style button" << std::endl;
}
};
// 抽象工厂
class GUIFactory {
public:
virtual Button* CreateButton() = 0;
virtual ~GUIFactory() {}
};
class WinFactory : public GUIFactory {
public:
Button* CreateButton() override {
return new WinButton();
}
};
int main() {
GUIFactory* factory = new WinFactory();
Button* btn = factory->CreateButton();
btn->Paint(); // Output: Windows style button
delete btn;
delete factory;
return 0;
}
4. 建造者模式(Builder)
场景:复杂报表生成、餐饮套餐组合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <string>
class Pizza {
public:
void SetDough(const std::string& dough) { dough_ = dough; }
void SetSauce(const std::string& sauce) { sauce_ = sauce; }
void ShowPizza() {
std::cout << "Pizza with " << dough_ << " dough and "
<< sauce_ << " sauce" << std::endl;
}
private:
std::string dough_;
std::string sauce_;
};
class PizzaBuilder {
public:
virtual void BuildDough() = 0;
virtual void BuildSauce() = 0;
virtual Pizza* GetPizza() = 0;
virtual ~PizzaBuilder() {}
};
class HawaiianPizzaBuilder : public PizzaBuilder {
public:
HawaiianPizzaBuilder() { pizza_ = new Pizza(); }
void BuildDough() override { pizza_->SetDough("cross"); }
void BuildSauce() override { pizza_->SetSauce("mild"); }
Pizza* GetPizza() override { return pizza_; }
private:
Pizza* pizza_;
};
class Cook {
public:
void MakePizza(PizzaBuilder* builder) {
builder->BuildDough();
builder->BuildSauce();
}
};
int main() {
Cook cook;
HawaiianPizzaBuilder builder;
cook.MakePizza(&builder);
Pizza* pizza = builder.GetPizza();
pizza->ShowPizza(); // Output: Pizza with cross dough and mild sauce
delete pizza;
return 0;
}
5. 原型模式(Prototype)
场景:游戏对象克隆、复杂对象初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <memory>
class Prototype {
public:
virtual std::unique_ptr<Prototype> Clone() const = 0;
virtual void PrintID() const = 0;
virtual ~Prototype() {}
};
class ConcretePrototype : public Prototype {
public:
ConcretePrototype(int id) : id_(id) {}
std::unique_ptr<Prototype> Clone() const override {
return std::make_unique<ConcretePrototype>(*this);
}
void PrintID() const override {
std::cout << "Instance ID: " << id_ << std::endl;
}
private:
int id_;
};
int main() {
ConcretePrototype original(1001);
auto clone = original.Clone();
original.PrintID(); // Output: Instance ID: 1001
clone->PrintID(); // Output: Instance ID: 1001
return 0;
}
结构型(7种)
1. 适配器模式(Adapter)
场景:集成旧系统接口、第三方库兼容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
// 旧式圆形接口
class LegacyCircle {
public:
void Draw(int x, int y, int r) {
std::cout << "Legacy circle at (" << x << "," << y << ") radius " << r << std::endl;
}
};
// 新标准图形接口
class Shape {
public:
virtual void Draw(float x, float y, float radius) = 0;
virtual ~Shape() {}
};
// 适配器类
class CircleAdapter : public Shape {
public:
void Draw(float x, float y, float radius) override {
legacyCircle_.Draw(static_cast<int>(x), static_cast<int>(y), static_cast<int>(radius));
}
private:
LegacyCircle legacyCircle_;
};
int main() {
Shape* shape = new CircleAdapter();
shape->Draw(5.5f, 10.2f, 3.0f); // Output: Legacy circle at (5,10) radius 3
delete shape;
return 0;
}
2. 桥接模式(Bridge)
场景:跨平台渲染引擎、设备抽象层
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
// 实现接口
class Renderer {
public:
virtual void RenderCircle(float x, float y, float radius) = 0;
virtual ~Renderer() {}
};
// 具体实现:OpenGL
class OpenGLRenderer : public Renderer {
public:
void RenderCircle(float x, float y, float radius) override {
std::cout << "OpenGL rendering circle at (" << x << "," << y << ") r=" << radius << std::endl;
}
};
// 抽象接口
class Shape {
protected:
Renderer& renderer_;
public:
Shape(Renderer& renderer) : renderer_(renderer) {}
virtual void Draw() = 0;
virtual ~Shape() {}
};
class Circle : public Shape {
float x_, y_, radius_;
public:
Circle(Renderer& renderer, float x, float y, float r)
: Shape(renderer), x_(x), y_(y), radius_(r) {}
void Draw() override {
renderer_.RenderCircle(x_, y_, radius_);
}
};
int main() {
OpenGLRenderer renderer;
Circle circle(renderer, 5, 10, 3);
circle.Draw(); // Output: OpenGL rendering circle at (5,10) r=3
return 0;
}
3. 组合模式(Composite)
场景:文件系统管理、GUI容器组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <vector>
class Graphic {
public:
virtual void Draw() = 0;
virtual void Add(Graphic* g) {}
virtual ~Graphic() {}
};
class Circle : public Graphic {
public:
void Draw() override {
std::cout << "Drawing Circle" << std::endl;
}
};
class CompositeGraphic : public Graphic {
std::vector<Graphic*> children_;
public:
void Draw() override {
for (auto& child : children_) {
child->Draw();
}
}
void Add(Graphic* g) override {
children_.push_back(g);
}
};
int main() {
CompositeGraphic container;
container.Add(new Circle());
container.Add(new Circle());
container.Draw();
// Output:
// Drawing Circle
// Drawing Circle
return 0;
}
4. 装饰器模式(Decorator)
场景:动态添加功能、数据流处理链
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <string>
class DataSource {
public:
virtual void WriteData(const std::string& data) = 0;
virtual ~DataSource() {}
};
class FileDataSource : public DataSource {
public:
void WriteData(const std::string& data) override {
std::cout << "Writing raw data: " << data << std::endl;
}
};
class DataSourceDecorator : public DataSource {
protected:
DataSource* wrappee_;
public:
DataSourceDecorator(DataSource* source) : wrappee_(source) {}
};
class EncryptionDecorator : public DataSourceDecorator {
public:
using DataSourceDecorator::DataSourceDecorator;
void WriteData(const std::string& data) override {
std::string encrypted = "Encrypted[" + data + "]";
wrappee_->WriteData(encrypted);
}
};
int main() {
DataSource* source = new EncryptionDecorator(new FileDataSource());
source->WriteData("Secret"); // Output: Writing raw data: Encrypted[Secret]
delete source;
return 0;
}
5. 外观模式(Facade)
场景:简化复杂子系统调用、API封装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
class CPU {
public:
void Boot() { std::cout << "CPU booting...\n"; }
};
class Memory {
public:
void Check() { std::cout << "Memory check...\n"; }
};
class ComputerFacade {
CPU cpu_;
Memory memory_;
public:
void Start() {
memory_.Check();
cpu_.Boot();
std::cout << "System ready\n";
}
};
int main() {
ComputerFacade computer;
computer.Start();
// Output:
// Memory check...
// CPU booting...
// System ready
return 0;
}
6. 享元模式(Flyweight)
场景:文本编辑器字符格式管理、游戏粒子系统
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <unordered_map>
class CharacterStyle {
std::string font_;
int size_;
bool bold_;
public:
CharacterStyle(const std::string& font, int size, bool bold)
: font_(font), size_(size), bold_(bold) {}
void ApplyStyle() const {
std::cout << "Apply style: " << font_ << " " << size_
<< (bold_ ? " bold" : "") << std::endl;
}
};
class StyleFactory {
std::unordered_map<std::string, CharacterStyle*> styles_;
public:
CharacterStyle* GetStyle(const std::string& font, int size, bool bold) {
std::string key = font + std::to_string(size) + (bold ? "1" : "0");
if (!styles_.count(key)) {
styles_[key] = new CharacterStyle(font, size, bold);
}
return styles_[key];
}
~StyleFactory() {
for (auto& pair : styles_) delete pair.second;
}
};
int main() {
StyleFactory factory;
auto style1 = factory.GetStyle("Arial", 12, false);
auto style2 = factory.GetStyle("Arial", 12, false); // 复用对象
style1->ApplyStyle(); // Output: Apply style: Arial 12
return 0;
}
7. 代理模式(Proxy)
场景:延迟加载、访问控制、远程服务调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <string>
class Image {
public:
virtual void Display() = 0;
virtual ~Image() {}
};
class RealImage : public Image {
std::string filename_;
public:
RealImage(const std::string& filename) : filename_(filename) {
LoadFromDisk();
}
void Display() override {
std::cout << "Displaying " << filename_ << std::endl;
}
private:
void LoadFromDisk() {
std::cout << "Loading " << filename_ << " from disk..." << std::endl;
}
};
class ImageProxy : public Image {
RealImage* realImage_ = nullptr;
std::string filename_;
public:
ImageProxy(const std::string& filename) : filename_(filename) {}
void Display() override {
if (!realImage_) {
realImage_ = new RealImage(filename_);
}
realImage_->Display();
}
~ImageProxy() {
delete realImage_;
}
};
int main() {
Image* image = new ImageProxy("photo.jpg");
// 此时尚未加载真实图片
image->Display(); // 第一次调用时加载
// Output:
// Loading photo.jpg from disk...
// Displaying photo.jpg
delete image;
return 0;
}
行为型(11种)
1. 责任链模式(Chain of Responsibility)
场景:审批流程、异常处理链
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <string>
class Handler {
protected:
Handler* next_ = nullptr;
public:
virtual void HandleRequest(const std::string& request) = 0;
void SetNext(Handler* next) { next_ = next; }
virtual ~Handler() {}
};
class ConcreteHandlerA : public Handler {
public:
void HandleRequest(const std::string& request) override {
if (request == "A") {
std::cout << "Handler A processed request\n";
} else if (next_) {
next_->HandleRequest(request);
}
}
};
class ConcreteHandlerB : public Handler {
public:
void HandleRequest(const std::string& request) override {
if (request == "B") {
std::cout << "Handler B processed request\n";
} else if (next_) {
next_->HandleRequest(request);
}
}
};
int main() {
Handler* chain = new ConcreteHandlerA();
chain->SetNext(new ConcreteHandlerB());
chain->HandleRequest("B"); // Output: Handler B processed request
delete chain;
return 0;
}
2. 命令模式(Command)
场景:GUI操作、事务管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
class Light {
public:
void On() { std::cout << "Light is on\n"; }
void Off() { std::cout << "Light is off\n"; }
};
class Command {
public:
virtual void Execute() = 0;
virtual ~Command() {}
};
class LightOnCommand : public Command {
Light& light_;
public:
LightOnCommand(Light& light) : light_(light) {}
void Execute() override { light_.On(); }
};
class RemoteControl {
Command* command_;
public:
void SetCommand(Command* cmd) { command_ = cmd; }
void PressButton() { command_->Execute(); }
};
int main() {
Light light;
RemoteControl remote;
remote.SetCommand(new LightOnCommand(light));
remote.PressButton(); // Output: Light is on
return 0;
}
3. 解释器模式(Interpreter)
场景:SQL解析、规则引擎
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
#include <unordered_map>
class Context {
std::unordered_map<std::string, bool> variables_;
public:
void SetVariable(const std::string& var, bool value) {
variables_[var] = value;
}
bool GetVariable(const std::string& var) {
return variables_[var];
}
};
class Expression {
public:
virtual bool Interpret(Context& context) = 0;
virtual ~Expression() {}
};
class Variable : public Expression {
std::string name_;
public:
Variable(const std::string& name) : name_(name) {}
bool Interpret(Context& context) override {
return context.GetVariable(name_);
}
};
int main() {
Context context;
context.SetVariable("X", true);
Expression* expr = new Variable("X");
std::cout << std::boolalpha << expr->Interpret(context); // Output: true
delete expr;
return 0;
}
4. 迭代器模式(Iterator)
场景:集合遍历、文件系统导航
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <vector>
template <typename T>
class Iterator {
public:
virtual T Next() = 0;
virtual bool HasNext() = 0;
virtual ~Iterator() {}
};
template <typename T>
class VectorIterator : public Iterator<T> {
std::vector<T> data_;
size_t index_ = 0;
public:
VectorIterator(const std::vector<T>& data) : data_(data) {}
T Next() override { return data_[index_++]; }
bool HasNext() override { return index_ < data_.size(); }
};
int main() {
std::vector<int> numbers{1, 2, 3};
Iterator<int>* it = new VectorIterator<int>(numbers);
while (it->HasNext()) {
std::cout << it->Next() << " "; // Output: 1 2 3
}
delete it;
return 0;
}
5. 中介者模式(Mediator)
场景:聊天室、GUI组件协调
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <string>
#include <vector>
class Colleague;
class Mediator {
public:
virtual void Notify(Colleague* sender, const std::string& msg) = 0;
};
class Colleague {
protected:
Mediator* mediator_;
public:
Colleague(Mediator* mediator) : mediator_(mediator) {}
virtual ~Colleague() {}
};
class ConcreteColleagueA : public Colleague {
public:
using Colleague::Colleague;
void Send(const std::string& msg) {
mediator_->Notify(this, msg);
}
void Receive(const std::string& msg) {
std::cout << "Colleague A received: " << msg << "\n";
}
};
class ConcreteMediator : public Mediator {
std::vector<Colleague*> colleagues_;
public:
void AddColleague(Colleague* col) {
colleagues_.push_back(col);
}
void Notify(Colleague* sender, const std::string& msg) override {
for (auto col : colleagues_) {
if (col != sender) {
if (auto a = dynamic_cast<ConcreteColleagueA*>(col)) {
a->Receive(msg);
}
}
}
}
};
int main() {
ConcreteMediator mediator;
ConcreteColleagueA c1(&mediator);
ConcreteColleagueA c2(&mediator);
mediator.AddColleague(&c1);
mediator.AddColleague(&c2);
c1.Send("Hello"); // Output: Colleague A received: Hello
return 0;
}
6. 备忘录模式(Memento)
场景:撤销操作、游戏存档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>
class EditorMemento {
std::string content_;
public:
EditorMemento(const std::string& content) : content_(content) {}
std::string GetContent() const { return content_; }
};
class Editor {
std::string content_;
public:
void Write(const std::string& text) { content_ += text; }
EditorMemento* Save() { return new EditorMemento(content_); }
void Restore(EditorMemento* memento) { content_ = memento->GetContent(); }
void Show() { std::cout << "Content: " << content_ << "\n"; }
};
int main() {
Editor editor;
editor.Write("Hello ");
auto save = editor.Save();
editor.Write("World");
editor.Show(); // Output: Content: Hello World
editor.Restore(save);
editor.Show(); // Output: Content: Hello
delete save;
return 0;
}
7. 观察者模式(Observer)
场景:事件通知、数据监控
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <vector>
class Observer {
public:
virtual void Update(float temp) = 0;
virtual ~Observer() {}
};
class Subject {
std::vector<Observer*> observers_;
float temperature_;
public:
void Attach(Observer* obs) { observers_.push_back(obs); }
void SetTemperature(float temp) {
temperature_ = temp;
Notify();
}
void Notify() {
for (auto obs : observers_) {
obs->Update(temperature_);
}
}
};
class Display : public Observer {
public:
void Update(float temp) override {
std::cout << "Temperature updated: " << temp << "℃\n";
}
};
int main() {
Subject weatherStation;
Display display;
weatherStation.Attach(&display);
weatherStation.SetTemperature(25.5f); // Output: Temperature updated: 25.5℃
return 0;
}
8. 状态模式(State)
场景:订单状态机、游戏角色状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
class State {
public:
virtual void Handle() = 0;
virtual ~State() {}
};
class ConcreteStateA : public State {
public:
void Handle() override { std::cout << "State A handling\n"; }
};
class Context {
State* state_ = nullptr;
public:
void SetState(State* state) { state_ = state; }
void Request() { state_->Handle(); }
};
int main() {
Context context;
context.SetState(new ConcreteStateA());
context.Request(); // Output: State A handling
return 0;
}
9. 策略模式(Strategy)
场景:支付方式选择、排序算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
class PaymentStrategy {
public:
virtual void Pay(int amount) = 0;
virtual ~PaymentStrategy() {}
};
class CreditCardPayment : public PaymentStrategy {
public:
void Pay(int amount) override {
std::cout << "Paid " << amount << " via Credit Card\n";
}
};
class PaymentContext {
PaymentStrategy* strategy_;
public:
PaymentContext(PaymentStrategy* strategy) : strategy_(strategy) {}
void ExecutePayment(int amount) { strategy_->Pay(amount); }
};
int main() {
PaymentContext context(new CreditCardPayment());
context.ExecutePayment(100); // Output: Paid 100 via Credit Card
return 0;
}
10. 模板方法模式(Template Method)
场景:算法框架定义、流程标准化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
class DataProcessor {
public:
void Process() {
LoadData();
AnalyzeData();
SaveResult();
}
virtual ~DataProcessor() {}
protected:
virtual void LoadData() = 0;
virtual void AnalyzeData() { std::cout << "Default analysis\n"; }
virtual void SaveResult() = 0;
};
class CSVProcessor : public DataProcessor {
protected:
void LoadData() override { std::cout << "Loading CSV\n"; }
void SaveResult() override { std::cout << "Saving CSV results\n"; }
};
int main() {
DataProcessor* processor = new CSVProcessor();
processor->Process();
// Output:
// Loading CSV
// Default analysis
// Saving CSV results
delete processor;
return 0;
}
11. 访问者模式(Visitor)
场景:编译器AST处理、复杂结构操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
class Element;
class Visitor {
public:
virtual void Visit(Element& element) = 0;
virtual ~Visitor() {}
};
class Element {
public:
virtual void Accept(Visitor& visitor) = 0;
virtual ~Element() {}
};
class ConcreteElement : public Element {
public:
void Accept(Visitor& visitor) override { visitor.Visit(*this); }
void Operation() { std::cout << "Element operation\n"; }
};
class ConcreteVisitor : public Visitor {
public:
void Visit(Element& element) override {
std::cout << "Visitor processing element\n";
dynamic_cast<ConcreteElement&>(element).Operation();
}
};
int main() {
ConcreteElement element;
ConcreteVisitor visitor;
element.Accept(visitor);
// Output:
// Visitor processing element
// Element operation
return 0;
}
本文由作者按照 CC BY 4.0 进行授权