C++设计模式
引言
设计模式是软件开发过程中解决常见问题的一种方法论。它们提供了一种通用的解决方案,帮助开发者应对软件设计中的复杂性,提高代码的可维护性和可扩展性。
本篇文章将介绍几种重要的C++设计模式,并通过具体案例和场景进行说明,以便读者能够理解并应用这些设计模式。
设计模式分类
设计模式通常分为三大类:
- 创建型模式:关注对象的创建方式。
- 结构型模式:关注对象的组合。
- 行为型模式:关注对象之间的交互。
下面将详细介绍这些模式。
创建型模式
1. 单例模式 (Singleton)
定义
单例模式确保一个类只有一个实例,并提供一个全局访问点。
实现
cppCopy Code#include <iostream>
class Singleton {
private:
static Singleton* instance;
// 私有构造函数
Singleton() {}
public:
// 禁止复制构造函数
Singleton(Singleton &other) = delete;
void operator=(const Singleton &) = delete;
static Singleton* getInstance() {
if (!instance)
instance = new Singleton();
return instance;
}
void showMessage() {
std::cout << "Hello, Singleton Pattern!" << std::endl;
}
};
// 初始化静态成员
Singleton* Singleton::instance = nullptr;
int main() {
Singleton::getInstance()->showMessage();
return 0;
}
场景
单例模式常用于日志记录、配置管理等需要全局访问的场景。
2. 工厂模式 (Factory Method)
定义
工厂模式定义一个创建对象的接口,但让子类决定实例化哪一个类。
实现
cppCopy Code#include <iostream>
#include <memory>
// 产品接口
class Product {
public:
virtual void use() = 0;
};
// 具体产品A
class ConcreteProductA : public Product {
public:
void use() override {
std::cout << "Using Product A" << std::endl;
}
};
// 具体产品B
class ConcreteProductB : public Product {
public:
void use() override {
std::cout << "Using Product B" << std::endl;
}
};
// 工厂接口
class Creator {
public:
virtual std::unique_ptr<Product> factoryMethod() = 0;
};
// 具体工厂A
class ConcreteCreatorA : public Creator {
public:
std::unique_ptr<Product> factoryMethod() override {
return std::make_unique<ConcreteProductA>();
}
};
// 具体工厂B
class ConcreteCreatorB : public Creator {
public:
std::unique_ptr<Product> factoryMethod() override {
return std::make_unique<ConcreteProductB>();
}
};
int main() {
ConcreteCreatorA creatorA;
std::unique_ptr<Product> productA = creatorA.factoryMethod();
productA->use();
ConcreteCreatorB creatorB;
std::unique_ptr<Product> productB = creatorB.factoryMethod();
productB->use();
return 0;
}
场景
工厂模式适合于需要创建复杂对象或多个相似对象的场景,如数据库连接、图形界面组件等。
结构型模式
1. 适配器模式 (Adapter)
定义
适配器模式允许不兼容的接口协同工作,通过包装一个对象来使其接口符合另一个接口。
实现
cppCopy Code#include <iostream>
// 目标接口
class Target {
public:
virtual void request() {
std::cout << "Target request" << std::endl;
}
};
// 源类
class Adaptee {
public:
void specificRequest() {
std::cout << "Specific request" << std::endl;
}
};
// 适配器类
class Adapter : public Target {
private:
Adaptee* adaptee;
public:
Adapter(Adaptee* a) : adaptee(a) {}
void request() override {
adaptee->specificRequest();
}
};
int main() {
Adaptee* adaptee = new Adaptee();
Target* adapter = new Adapter(adaptee);
adapter->request();
delete adaptee;
delete adapter;
return 0;
}
场景
适配器模式常用于需要整合多个不兼容的接口时,例如在第三方库的集成中。
2. 装饰者模式 (Decorator)
定义
装饰者模式允许向现有对象添加新功能,而无需改变其结构。
实现
cppCopy Code#include <iostream>
// 组件接口
class Component {
public:
virtual void operation() = 0;
};
// 具体组件
class ConcreteComponent : public Component {
public:
void operation() override {
std::cout << "ConcreteComponent operation" << std::endl;
}
};
// 装饰者基类
class Decorator : public Component {
protected:
Component* component;
public:
Decorator(Component* c) : component(c) {}
void operation() override {
component->operation();
}
};
// 具体装饰者A
class ConcreteDecoratorA : public Decorator {
public:
ConcreteDecoratorA(Component* c) : Decorator(c) {}
void operation() override {
Decorator::operation();
std::cout << "ConcreteDecoratorA additional operation" << std::endl;
}
};
// 具体装饰者B
class ConcreteDecoratorB : public Decorator {
public:
ConcreteDecoratorB(Component* c) : Decorator(c) {}
void operation() override {
Decorator::operation();
std::cout << "ConcreteDecoratorB additional operation" << std::endl;
}
};
int main() {
ConcreteComponent* component = new ConcreteComponent();
ConcreteDecoratorA* decoratorA = new ConcreteDecoratorA(component);
ConcreteDecoratorB* decoratorB = new ConcreteDecoratorB(decoratorA);
decoratorB->operation();
delete decoratorB;
delete decoratorA;
delete component;
return 0;
}
场景
装饰者模式适用于动态地为对象添加功能,如图形界面元素、输入流和输出流的增强等。
行为型模式
1. 观察者模式 (Observer)
定义
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象的状态变化。
实现
cppCopy Code#include <iostream>
#include <vector>
// 观察者接口
class Observer {
public:
virtual void update(int value) = 0;
};
// 主题接口
class Subject {
public:
virtual void attach(Observer* observer) = 0;
virtual void detach(Observer* observer) = 0;
virtual void notify() = 0;
};
// 具体主题
class ConcreteSubject : public Subject {
private:
std::vector<Observer*> observers;
int state;
public:
void attach(Observer* observer) override {
observers.push_back(observer);
}
void detach(Observer* observer) override {
observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
}
void notify() override {
for (auto observer : observers) {
observer->update(state);
}
}
void setState(int value) {
state = value;
notify();
}
};
// 具体观察者
class ConcreteObserver : public Observer {
private:
std::string name;
public:
ConcreteObserver(std::string name) : name(name) {}
void update(int value) override {
std::cout << "Observer " << name << " received value: " << value << std::endl;
}
};
int main() {
ConcreteSubject subject;
ConcreteObserver observer1("A");
ConcreteObserver observer2("B");
subject.attach(&observer1);
subject.attach(&observer2);
subject.setState(10);
subject.setState(20);
return 0;
}
场景
观察者模式常用于事件驱动系统、GUI框架的组件间通讯等。
2. 策略模式 (Strategy)
定义
策略模式定义了一系列算法,将每一个算法封装起来,并使它们可以互换。
实现
cppCopy Code#include <iostream>
// 策略接口
class Strategy {
public:
virtual void execute() = 0;
};
// 具体策略A
class ConcreteStrategyA : public Strategy {
public:
void execute() override {
std::cout << "Executing Strategy A" << std::endl;
}
};
// 具体策略B
class ConcreteStrategyB : public Strategy {
public:
void execute() override {
std::cout << "Executing Strategy B" << std::endl;
}
};
// 上下文类
class Context {
private:
Strategy* strategy;
public:
Context(Strategy* s) : strategy(s) {}
void setStrategy(Strategy* s) {
strategy = s;
}
void executeStrategy() {
strategy->execute();
}
};
int main() {
ConcreteStrategyA strategyA;
ConcreteStrategyB strategyB;
Context context(&strategyA);
context.executeStrategy();
context.setStrategy(&strategyB);
context.executeStrategy();
return 0;
}
场景
策略模式适用于需要在运行时选择算法的场景,例如排序算法、支付方式选择等。
总结
本文介绍了几种常见的C++设计模式,包括单例模式、工厂模式、适配器模式、装饰者模式、观察者模式和策略模式。每种模式都有其独特的应用场景,能够帮助开发者提高代码质量和项目的可维护性。
通过理解和应用设计模式,开发者可以更有效地解决实际问题,提升软件开发的效率和质量。在实践中,结合具体业务需求灵活使用设计模式,能够显著增强系统的可扩展性和可复用性。
本站地址: https://www.ffyonline.com/pageSingle/articleOneWeb/106368