设计模式(Design Patterns)是一种解决特定问题的通用解决方案,通常分为以下三类:
创建型模式(Creational Patterns):
结构型模式(Structural Patterns):
行为型模式(Behavioral Patterns):
工厂方法模式(Factory Method):
class Product {
public:
virtual void use() = 0;
};
class ConcreteProductA : public Product {
public:
void use() override {
// Implementation for Product A
}
};
class ConcreteProductB : public Product {
public:
void use() override {
// Implementation for Product B
}
};
class Creator {
public:
virtual Product* createProduct() = 0;
};
class ConcreteCreatorA : public Creator {
public:
Product* createProduct() override {
return new ConcreteProductA();
}
};
class ConcreteCreatorB : public Creator {
public:
Product* createProduct() override {
return new ConcreteProductB();
}
};
抽象工厂模式(Abstract Factory):
class AbstractProductA {
public:
virtual void use() = 0;
};
class AbstractProductB {
public:
virtual void consume() = 0;
};
class ConcreteProductA1 : public AbstractProductA {
public:
void use() override {
// Implementation for Product A1
}
};
class ConcreteProductA2 : public AbstractProductA {
public:
void use() override {
// Implementation for Product A2
}
};
class ConcreteProductB1 : public AbstractProductB {
public:
void consume() override {
// Implementation for Product B1
}
};
class ConcreteProductB2 : public AbstractProductB {
public:
void consume() override {
// Implementation for Product B2
}
};
class AbstractFactory {
public:
virtual AbstractProductA* createProductA() = 0;
virtual AbstractProductB* createProductB() = 0;
};
class ConcreteFactory1 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ConcreteProductA1();
}
AbstractProductB* createProductB() override {
return new ConcreteProductB1();
}
};
class ConcreteFactory2 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ConcreteProductA2();
}
AbstractProductB* createProductB() override {
return new ConcreteProductB2();
}
};
单例模式(Singleton):
class Singleton {
private:
static Singleton* instance;
Singleton() {} // Private constructor
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
生成器模式(Builder):
class Product {
private:
std::string partA;
std::string partB;
std::string partC;
public:
void setPartA(const std::string& part) { partA = part; }
void setPartB(const std::string& part) { partB = part; }
void setPartC(const std::string& part) { partC = part; }
void show() {
// Implementation to show the product
}
};
class Builder {
public:
virtual void buildPartA() = 0;
virtual void buildPartB() = 0;
virtual void buildPartC() = 0;
virtual Product* getResult() = 0;
};
class ConcreteBuilder : public Builder {
private:
Product* product;
public:
ConcreteBuilder() { product = new Product(); }
void buildPartA() override { product->setPartA("Part A"); }
void buildPartB() override { product->setPartB("Part B"); }
void buildPartC() override { product->setPartC("Part C"); }
Product* getResult() override { return product; }
};
class Director {
private:
Builder* builder;
public:
void setBuilder(Builder* b) { builder = b; }
void construct() {
builder->buildPartA();
builder->buildPartB();
builder->buildPartC();
}
};
原型模式(Prototype):
class Prototype {
public:
virtual Prototype* clone() const = 0;
};
class ConcretePrototype : public Prototype {
public:
ConcretePrototype* clone() const override {
return new ConcretePrototype(*this);
}
};
适配器模式(Adapter):
class Target {
public:
virtual void request() = 0;
};
class Adaptee {
public:
void specificRequest() {
// Specific implementation
}
};
class Adapter : public Target {
private:
Adaptee* adaptee;
public:
Adapter(Adaptee* a) : adaptee(a) {}
void request() override {
adaptee->specificRequest();
}
};
桥接模式(Bridge):
class Implementor {
public:
virtual void operationImpl() = 0;
};
class ConcreteImplementorA : public Implementor {
public:
void operationImpl() override {
// Implementation A
}
};
class ConcreteImplementorB : public Implementor {
public:
void operationImpl() override {
// Implementation B
}
};
class Abstraction {
protected:
Implementor* implementor;
public:
Abstraction(Implementor* impl) : implementor(impl) {}
virtual void operation() = 0;
};
class RefinedAbstraction : public Abstraction {
public:
RefinedAbstraction(Implementor* impl) : Abstraction(impl) {}
void operation() override {
implementor->operationImpl();
}
};
组合模式(Composite):
class Component {
public:
virtual void operation() = 0;
virtual void add(Component* component) {}
virtual void remove(Component* component) {}
virtual Component* getChild(int index) { return nullptr; }
};
class Leaf : public Component {
public:
void operation() override {
// Implementation of leaf node
}
};
class Composite : public Component {
private:
std::vector<Component*> children;
public:
void operation() override {
for (Component* child : children) {
child->operation();
}
}
void add(Component* component) override {
children.push_back(component);
}
void remove(Component* component) override {
children.erase(std::remove(children.begin(), children.end(), component), children.end());
}
Component* getChild(int index) override {
return children.at(index);
}
};
装饰模式(Decorator):
class Component {
public:
virtual void operation() = 0;
};
class ConcreteComponent : public Component {
public:
void operation() override {
// Basic implementation
}
};
class Decorator : public Component {
protected:
行为型模式(Behavioral Patterns)关注对象之间的责任分配以及对象之间的通信。它们帮助实现对象之间的灵活通信和职责分配,从而提高系统的可扩展性和可维护性。以下是一些常见的行为型设计模式及其 C++ 示例:
1. 策略模式(Strategy Pattern)
策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响使用算法的客户。
示例代码:
#include
#include
// 策略接口
class Strategy {
public:
virtual void execute() const = 0;
};
// 具体策略A
class ConcreteStrategyA : public Strategy {
public:
void execute() const override {
std::cout << "Executing Strategy A" << std::endl;
}
};
// 具体策略B
class ConcreteStrategyB : public Strategy {
public:
void execute() const override {
std::cout << "Executing Strategy B" << std::endl;
}
};
// 上下文类
class Context {
private:
std::unique_ptr<Strategy> strategy;
public:
void setStrategy(std::unique_ptr<Strategy> strategy) {
this->strategy = std::move(strategy);
}
void executeStrategy() const {
strategy->execute();
}
};
int main() {
Context context;
context.setStrategy(std::make_unique<ConcreteStrategyA>());
context.executeStrategy();
context.setStrategy(std::make_unique<ConcreteStrategyB>());
context.executeStrategy();
return 0;
}
2. 观察者模式(Observer Pattern)
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
示例代码:
#include
#include
#include
// 观察者接口
class Observer {
public:
virtual void update(int state) = 0;
};
// 具体观察者
class ConcreteObserver : public Observer {
private:
std::string name;
public:
ConcreteObserver(const std::string& name) : name(name) {}
void update(int state) override {
std::cout << "Observer " << name << " updated with state " << state << std::endl;
}
};
// 主题接口
class Subject {
public:
virtual void attach(std::shared_ptr<Observer> observer) = 0;
virtual void detach(std::shared_ptr<Observer> observer) = 0;
virtual void notify() = 0;
};
// 具体主题
class ConcreteSubject : public Subject {
private:
std::vector<std::shared_ptr<Observer>> observers;
int state;
public:
void attach(std::shared_ptr<Observer> observer) override {
observers.push_back(observer);
}
void detach(std::shared_ptr<Observer> observer) override {
observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
}
void notify() override {
for (const auto& observer : observers) {
observer->update(state);
}
}
void setState(int state) {
this->state = state;
notify();
}
};
int main() {
auto subject = std::make_shared<ConcreteSubject>();
auto observer1 = std::make_shared<ConcreteObserver>("Observer 1");
auto observer2 = std::make_shared<ConcreteObserver>("Observer 2");
subject->attach(observer1);
subject->attach(observer2);
subject->setState(1);
subject->setState(2);
subject->detach(observer1);
subject->setState(3);
return 0;
}
3. 命令模式(Command Pattern)
命令模式将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
示例代码:
#include
#include
#include
// 命令接口
class Command {
public:
virtual void execute() const = 0;
};
// 具体命令A
class ConcreteCommandA : public Command {
public:
void execute() const override {
std::cout << "Executing Command A" << std::endl;
}
};
// 具体命令B
class ConcreteCommandB : public Command {
public:
void execute() const override {
std::cout << "Executing Command B" << std::endl;
}
};
// 调用者
class Invoker {
private:
std::vector<std::unique_ptr<Command>> commands;
public:
void setCommand(std::unique_ptr<Command> command) {
commands.push_back(std::move(command));
}
void executeCommands() const {
for (const auto& command : commands) {
command->execute();
}
}
};
int main() {
Invoker invoker;
invoker.setCommand(std::make_unique<ConcreteCommandA>());
invoker.setCommand(std::make_unique<ConcreteCommandB>());
invoker.executeCommands();
return 0;
}
4. 职责链模式(Chain of Responsibility Pattern)
职责链模式为请求创建了一个接收对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。通过这种模式,多个对象都有机会处理这个请求。
示例代码:
#include
#include
// 处理者接口
class Handler {
public:
virtual void setNext(std::shared_ptr<Handler> nextHandler) = 0;
virtual void handleRequest(int request) = 0;
};
// 具体处理者A
class ConcreteHandlerA : public Handler {
private:
std::shared_ptr<Handler> next;
public:
void setNext(std::shared_ptr<Handler> nextHandler) override {
next = nextHandler;
}
void handleRequest(int request) override {
if (request < 10) {
std::cout << "ConcreteHandlerA handled request " << request << std::endl;
} else if (next) {
next->handleRequest(request);
}
}
};
// 具体处理者B
class ConcreteHandlerB : public Handler {
private:
std::shared_ptr<Handler> next;
public:
void setNext(std::shared_ptr<Handler> nextHandler) override {
next = nextHandler;
}
void handleRequest(int request) override {
if (request >= 10 && request < 20) {
std::cout << "ConcreteHandlerB handled request " << request << std::endl;
} else if (next) {
next->handleRequest(request);
}
}
};
int main() {
auto handlerA = std::make_shared<ConcreteHandlerA>();
auto handlerB = std::make_shared<ConcreteHandlerB>();
handlerA->setNext(handlerB);
handlerA->handleRequest(5);
handlerA->handleRequest(15);
return 0;
}
5. 状态模式(State Pattern)
状态模式允许对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
示例代码:
#include
#include
// 状态接口
class State {
public:
virtual void handle() = 0;
};
// 具体状态A
class ConcreteStateA : public State {
public:
void handle() override {
std::cout << "Handling state A" << std::endl;
}
};
// 具体状态B
class ConcreteStateB : public State {
public:
void handle() override {
std::cout << "Handling state B" << std::endl;
}
};
// 上下文类
class Context {
private:
std::shared_ptr<State> state;
public:
Context(std::shared_ptr<State> state) : state(state) {}
void setState(std::shared_ptr<State> newState) {
state = newState;
}
void request() {
state->handle();
}
};
int main() {
auto stateA = std::make_shared<ConcreteStateA>();
auto stateB = std::make_shared<ConcreteStateB>();
Context context(stateA);
context.request();
context.setState(stateB);
context.request();
return 0;
}
以上示例展示了行为型设计模式的基本概念和如何使用 C++ 实现这些模式。通过这些模式,可以更好地组织代码,实现更灵活和可维护的系统。
设计模式还可以根据范围分为两类:
类模式(Class Patterns):
对象模式(Object Patterns):
模板方法模式(Template Method):
class AbstractClass {
public:
void templateMethod() {
primitiveOperation1();
primitiveOperation2();
}
virtual void primitiveOperation1() = 0;
virtual void primitiveOperation2() = 0;
};
class ConcreteClass : public AbstractClass {
public:
void primitiveOperation1() override {
// Implementation of primitive operation 1
}
void primitiveOperation2() override {
// Implementation of primitive operation 2
}
};
工厂方法模式(Factory Method):
class Product {
public:
virtual void use() = 0;
};
class ConcreteProduct : public Product {
public:
void use() override {
// Implementation
}
};
class Creator {
public:
virtual Product* factoryMethod() = 0;
Product* create() {
return factoryMethod();
}
};
class ConcreteCreator : public Creator {
public:
Product* factoryMethod() override {
return new ConcreteProduct();
}
};
观察者模式(Observer):
class Observer {
public:
virtual void update() = 0;
};
class ConcreteObserver : public Observer {
public:
void update() override {
// Implementation of update
}
};
class Subject {
private:
std::vector<Observer*> observers;
public:
void attach(Observer* observer) {
observers.push_back(observer);
}
void detach(Observer* observer) {
observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
}
void notify() {
for (Observer* observer : observers) {
observer->update();
}
}
};
策略模式(Strategy):
class Strategy {
public:
virtual void algorithmInterface() = 0;
};
class ConcreteStrategyA : public Strategy {
public:
void algorithmInterface() override {
// Implementation of algorithm A
}
};
class ConcreteStrategyB : public Strategy {
public:
void algorithmInterface() override {
// Implementation of algorithm B
}
};
class Context {
private:
Strategy* strategy;
public:
Context(Strategy* s) : strategy(s) {}
void setStrategy(Strategy* s) {
strategy = s;
}
void contextInterface() {
strategy->algorithmInterface();
}
};
类模式:
对象模式:
通过合理使用类模式和对象模式,可以在设计中实现灵活性和可扩展性,解决复杂的软件设计问题。
从封装变化的角度来看,设计模式可以分为以下几类:
组件协作:
单一职责:
对象创建:
对象性能:
接口隔离:
状态变化:
数据结构:
行为变化:
领域问题:
以下是每种分类的 C++ 示例:
观察者模式:
class Observer {
public:
virtual void update() = 0;
};
class ConcreteObserver : public Observer {
public:
void update() override {
// Implementation of update
}
};
class Subject {
private:
std::vector<Observer*> observers;
public:
void attach(Observer* observer) {
observers.push_back(observer);
}
void detach(Observer* observer) {
observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
}
void notify() {
for (Observer* observer : observers) {
observer->update();
}
}
};
单一职责原则(示例化为类):
class FileReader {
public:
std::string read(const std::string& filePath) {
// Read file content
}
};
class FileWriter {
public:
void write(const std::string& filePath, const std::string& content) {
// Write content to file
}
};
工厂方法模式:
class Product {
public:
virtual void use() = 0;
};
class ConcreteProduct : public Product {
public:
void use() override {
// Implementation
}
};
class Creator {
public:
virtual Product* factoryMethod() = 0;
Product* create() {
return factoryMethod();
}
};
class ConcreteCreator : public Creator {
public:
Product* factoryMethod() override {
return new ConcreteProduct();
}
};
享元模式:
class Flyweight {
public:
virtual void operation() = 0;
};
class ConcreteFlyweight : public Flyweight {
public:
void operation() override {
// Implementation
}
};
class FlyweightFactory {
private:
std::unordered_map<std::string, Flyweight*> flyweights;
public:
Flyweight* getFlyweight(const std::string& key) {
if (flyweights.find(key) == flyweights.end()) {
flyweights[key] = new ConcreteFlyweight();
}
return flyweights[key];
}
};
接口隔离原则(示例化为类):
class Printer {
public:
virtual void print() = 0;
};
class Scanner {
public:
virtual void scan() = 0;
};
class AllInOnePrinter : public Printer, public Scanner {
public:
void print() override {
// Implementation
}
void scan() override {
// Implementation
}
};
状态模式:
class State {
public:
virtual void handle() = 0;
};
class ConcreteStateA : public State {
public:
void handle() override {
// Implementation of handle A
}
};
class ConcreteStateB : public State {
public:
void handle() override {
// Implementation of handle B
}
};
class Context {
private:
State* state;
public:
Context(State* s) : state(s) {}
void setState(State* s) {
state = s;
}
void request() {
state->handle();
}
};
组合模式:
class Component {
public:
virtual void operation() = 0;
};
class Leaf : public Component {
public:
void operation() override {
// Implementation of leaf operation
}
};
class Composite : public Component {
private:
std::vector<Component*> children;
public:
void operation() override {
for (Component* child : children) {
child->operation();
}
}
void add(Component* component) {
children.push_back(component);
}
void remove(Component* component) {
children.erase(std::remove(children.begin(), children.end(), component), children.end());
}
};
策略模式:
class Strategy {
public:
virtual void algorithmInterface() = 0;
};
class ConcreteStrategyA : public Strategy {
public:
void algorithmInterface() override {
// Implementation of algorithm A
}
};
class ConcreteStrategyB : public Strategy {
public:
void algorithmInterface() override {
// Implementation of algorithm B
}
};
class Context {
private:
Strategy* strategy;
public:
Context(Strategy* s) : strategy(s) {}
void setStrategy(Strategy* s) {
strategy = s;
}
void contextInterface() {
strategy->algorithmInterface();
}
};
领域驱动设计(示例化为类):
class ValueObject {
private:
int value;
public:
ValueObject(int v) : value(v) {}
int getValue() const {
return value;
}
bool operator==(const ValueObject& other) const {
return value == other.value;
}
};
class Entity {
private:
int id;
ValueObject valueObject;
public:
Entity(int i, ValueObject v) : id(i), valueObject(v) {}
int getId() const {
return id;
}
ValueObject getValueObject() const {
return valueObject;
}
};
class AggregateRoot : public Entity {
public:
using Entity::Entity;
void doSomething() {
// Implementation
}
};
这些示例展示了如何从封装变化的角度,使用C++实现不同的设计模式。