C++ 中的设计模式可以帮助开发者解决常见的编程问题,并通过组织代码来提高可维护性和可扩展性。设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。下面简要介绍这三类中的几种常见模式。
一、创建型模式
创建型模式关注对象的创建方式,确保在创建对象时不会直接实例化类,而是通过某种灵活的机制来创建对象。这种模式有助于隔离对象的创建过程,使代码更灵活。
-
单例模式(Singleton Pattern)
确保某个类只有一个实例,并提供一个全局访问点。示例代码:
class Singleton { private:static Singleton *instance;Singleton() {} // 私有化构造函数 public:static Singleton *getInstance(){if (instance == nullptr){instance = new Singleton();}return instance;} };Singleton *Singleton::instance = nullptr;
工厂方法模式(Factory Method Pattern)
定义一个创建对象的接口,但由子类决定实例化哪个类。工厂方法使类的实例化推迟到子类。示例代码:
class Product { public:virtual void use() = 0; };class ConcreteProductA : public Product { public:void use() override { std::cout << "Using Product A" << std::endl; } };class ConcreteProductB : public Product { public:void use() override { std::cout << "Using Product B" << std::endl; } };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 Pattern)
提供一个创建一系列相关或依赖对象的接口,而无需指定它们的具体类。示例代码:
class AbstractProductA { public:virtual void use() = 0; };class AbstractProductB { public:virtual void interact(AbstractProductA *productA) = 0; };class ConcreteProductA1 : public AbstractProductA { public:void use() override { std::cout << "Using Product A1" << std::endl; } };class ConcreteProductB1 : public AbstractProductB { public:void interact(AbstractProductA *productA) override{std::cout << "B1 interacting with ";productA->use();} };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(); } };
二、结构型模式
结构型模式关注类和对象的组合,通常用于实现复杂对象结构和对象之间的关系。
-
适配器模式(Adapter Pattern)
将一个类的接口转换为客户希望的另一个接口,适配器模式使得原本接口不兼容的类可以一起工作。示例代码:
class Target { public:virtual void request() { std::cout << "Target request" << std::endl; } };class Adaptee { public:void specificRequest() { std::cout << "Adaptee specific request" << std::endl; } };class Adapter : public Target { private:Adaptee *adaptee;public:Adapter(Adaptee *adaptee) : adaptee(adaptee) {}void request() override { adaptee->specificRequest(); } };
装饰者模式(Decorator Pattern)
动态地给对象增加功能,通过组合对象来实现,避免了继承的使用。示例代码:
class Component { public:virtual void operation() = 0; };class ConcreteComponent : public Component { public:void operation() override { std::cout << "Concrete Component operation" << std::endl; } };class Decorator : public Component { protected:Component *component;public:Decorator(Component *component) : component(component) {}void operation() override { component->operation(); } };class ConcreteDecoratorA : public Decorator { public:ConcreteDecoratorA(Component *component) : Decorator(component) {}void operation() override{Decorator::operation();std::cout << "Concrete Decorator A operation" << std::endl;} };
外观模式(Facade Pattern)
为子系统中的一组接口提供一个一致的接口,外观模式定义了一个高层接口,使得子系统更易使用。示例代码:
class SubsystemA { public:void operationA() { std::cout << "Subsystem A operation" << std::endl; } };class SubsystemB { public:void operationB() { std::cout << "Subsystem B operation" << std::endl; } };class Facade { private:SubsystemA *subsystemA;SubsystemB *subsystemB;public:Facade(){subsystemA = new SubsystemA();subsystemB = new SubsystemB();}void operation(){subsystemA->operationA();subsystemB->operationB();} };
三、行为型模式
行为型模式涉及对象之间的通信与职责的分配,着重于算法、职责和对象之间的相互作用。
-
观察者模式(Observer Pattern)
定义对象间的一对多依赖,当一个对象改变状态时,所有依赖它的对象都会收到通知并自动更新。示例代码:
class Observer { public:virtual void update() = 0; };class Subject { private:std::vector<Observer *> observers;public:void attach(Observer *observer) { observers.push_back(observer); }void notify(){for (auto *observer : observers){observer->update();}} };class ConcreteObserver : public Observer { public:void update() override { std::cout << "Observer updated" << std::endl; } };
策略模式(Strategy Pattern)
定义一组算法,将每个算法封装起来,并使它们可以互换。示例代码:
class Strategy { public:virtual void execute() = 0; };class ConcreteStrategyA : public Strategy { public:void execute() override { std::cout << "Strategy A executed" << std::endl; } };class ConcreteStrategyB : public Strategy { public:void execute() override { std::cout << "Strategy B executed" << std::endl; } };class Context { private:Strategy *strategy;public:void setStrategy(Strategy *strategy) { this->strategy = strategy; }void executeStrategy() { strategy->execute(); } };
这些只是常见设计模式中的一部分,使用设计模式有助于提高代码的可维护性和可扩展性,并使复杂系统中的代码更加简洁和易于理解。