23种常见设计模式(附代码帮助理解)

类别模式名称特点描述
创建型模式单例模式保证一个类只有一个实例,并提供一个全局访问点。
工厂方法定义创建对象的接口,让子类决定实例化哪一个类。
抽象工厂创建相关或依赖对象的家族,而不需明确指定具体类。
建造者模式分离复杂对象的构建和表示,使得同样的构建过程可以创建不同的表示。
原型模式通过拷贝现有的实例创建新的实例,而不是通过新建。
结构型模式适配器模式将一个类的接口转换成客户期望的另一个接口。
装饰器模式动态地给一个对象添加额外的职责。
代理模式为其他对象提供一个代替或占位符以控制对它的访问。
外观模式提供一个统一的接口来访问子系统中的一群接口。
桥接模式将抽象部分与它的实现部分分离,使它们可以独立地变化。
组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。
享元模式通过共享来高效地支持大量细粒度的对象。
行为型模式策略模式定义一系列算法,把它们一个个封装起来,并使它们可以互换。
模板方法在方法中定义一个算法的骨架,而将一些步骤的执行延迟到子类中。
观察者模式对象间存在一对多的依赖关系,当一个对象改变状态时,所有依赖于它的对象都被通知并自动更新。
迭代器模式顺序访问一个聚合对象中的各个元素,不暴露其内部的表示。
中介者模式用一个中介对象来封装一系列对象之间的交互。
命令模式将请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化。
备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
状态模式允许一个对象在其内部状态发生改变时改变其行为。
访问者模式为一个对象结构(如组合结构)增加新能力。
解释器模式定义一个语言的文法表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
1.单例模式 (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;
2.工厂方法模式 (Factory Method Pattern)

定义创建对象的接口,让子类决定实例化哪一个类。

class Product {
public:
    virtual ~Product() {}
    virtual void doSomething() const = 0;
};

class ConcreteProductA : public Product {
public:
    void doSomething() const override {
        std::cout << "ConcreteProductA does something." << std::endl;
    }
};

class ConcreteProductB : public Product {
public:
    void doSomething() const override {
        std::cout << "ConcreteProductB does something." << std::endl;
    }
};

class Creator {
public:
    virtual ~Creator() {}
    virtual Product* createProduct() const = 0;
};

class ConcreteCreatorA : public Creator {
public:
    Product* createProduct() const override {
        return new ConcreteProductA();
    }
};

class ConcreteCreatorB : public Creator {
public:
    Product* createProduct() const override {
        return new ConcreteProductB();
    }
};
3.抽象工厂模式 (Abstract Factory Pattern)

创建相关或依赖对象的家族,而不需明确指定具体类。

class AbstractFactory {
public:
    virtual ~AbstractFactory() {}
    virtual Product* createProduct() = 0;
};

class ConcreteFactoryA : public AbstractFactory {
public:
    Product* createProduct() override {
        return new ConcreteProductA();
    }
};

class ConcreteFactoryB : public AbstractFactory {
public:
    Product* createProduct() override {
        return new ConcreteProductB();
    }
};
4.建造者模式 (Builder Pattern)

分离复杂对象的构建和表示,使得同样的构建过程可以创建不同的表示。

class Product {
private:
    std::string part;

public:
    void setPart(const std::string& part) {
        this->part = part;
    }
    void display() const {
        std::cout << "Product Part: " << part << std::endl;
    }
};

class Builder {
public:
    virtual ~Builder() {}
    virtual void buildPart() = 0;
};

class ConcreteBuilder : public Builder {
private:
    Product* product;
public:
    ConcreteBuilder() : product(new Product()) {}
    ~ConcreteBuilder() {
        delete product;
    }
    void buildPart() override {
        product->setPart("ConcretePart");
    }
    Product* getProduct() {
        return product;
    }
};
5.原型模式 (Prototype Pattern)

通过拷贝现有的实例创建新的实例,而不是通过新建。

class Prototype {
public:
    virtual ~Prototype() {}
    virtual Prototype* clone() const = 0;
};

class ConcretePrototype : public Prototype {
public:
    Prototype* clone() const override {
        return new ConcretePrototype(*this);
    }
};
6.适配器模式 (Adapter Pattern)

将一个类的接口转换成客户期望的另一个接口。

class Target {
public:
    virtual ~Target() {}
    virtual void request() const = 0;
};

class Adaptee {
public:
    void specificRequest() const {
        std::cout << "Adaptee specific request." << std::endl;
    }
};

class Adapter : public Target {
private:
    Adaptee* adaptee;
public:
    Adapter(Adaptee* adaptee) : adaptee(adaptee) {}
    void request() const override {
        adaptee->specificRequest();
    }
};
7.装饰器模式 (Decorator Pattern)

动态地给一个对象添加额外的职责。

class Component {
public:
    virtual ~Component() {}
    virtual void operation() const = 0;
};

class ConcreteComponent : public Component {
public:
    void operation() const override {
        std::cout << "ConcreteComponent operation." << std::endl;
    }
};

class Decorator : public Component {
protected:
    Component* component;
public:
    Decorator(Component* component) : component(component) {}
    void operation() const override {
        component->operation();
    }
};

class ConcreteDecorator : public Decorator {
public:
    ConcreteDecorator(Component* component) : Decorator(component) {}
    void additionalOperation() const {
        std::cout << "ConcreteDecorator additional operation." << std::endl;
    }
    void operation() const override {
        Decorator::operation();
        additionalOperation();
    }
};
8.代理模式 (Proxy Pattern)

为其他对象提供一个代替或占位符以控制对它的访问。

class Subject {
public:
    virtual ~Subject() {}
    virtual void request() const = 0;
};

class RealSubject : public Subject {
public:
    void request() const override {
        std::cout << "RealSubject request." << std::endl;
    }
};

class Proxy : public Subject {
private:
    RealSubject* realSubject;
public:
    Proxy() : realSubject(new RealSubject()) {}
    void request() const override {
        realSubject->request();
    }
};
9.外观模式 (Facade Pattern)

提供一个统一的接口来访问子系统中的一群接口。

class SubsystemA {
public:
    void operationA() const {
        std::cout << "SubsystemA operationA." << std::endl;
    }
};

class SubsystemB {
public:
    void operationB() const {
        std::cout << "SubsystemB operationB." << std::endl;
    }
};

class Facade {
private:
    SubsystemA* subsystemA;
    SubsystemB* subsystemB;
public:
    Facade() : subsystemA(new SubsystemA()), subsystemB(new SubsystemB()) {}
    void operation() const {
        subsystemA->operationA();
        subsystemB->operationB();
    }
};
10.桥接模式 (Bridge Pattern)

将抽象部分与它的实现部分分离,使它们可以独立地变化。

class Implementation {
public:
    virtual ~Implementation() {}
    virtual void operationImpl() const = 0;
};

class RefinedAbstraction {
private:
    Implementation* implementation;
public:
    RefinedAbstraction(Implementation* implementation) : implementation(implementation) {}
    void operation() const {
        std::cout << "RefinedAbstraction operation with ";
        implementation->operationImpl();
    }
};

class ConcreteImplementationA : public Implementation {
public:
    void operationImpl() const override {
        std::cout << "ConcreteImplementationA.";
    }
};

class ConcreteImplementationB : public Implementation {
public:
    void operationImpl() const override {
        std::cout << "ConcreteImplementationB.";
    }
};
11.组合模式 (Composite Pattern)

将对象组合成树形结构以表示“部分-整体”的层次结构。

class Component {
public:
    virtual ~Component() {}
    virtual void operation() const = 0;
};

class Leaf : public Component {
public:
    void operation() const override {
        std::cout << "Leaf operation." << std::endl;
    }
};

class Composite : public Component {
private:
    std::vector<Component*> children;
public:
    void operation() const override {
        for (auto& 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());
    }
};
12.享元模式 (Flyweight Pattern) 

通过共享来高效地支持大量细粒度的对象。

class Flyweight {
public:
    virtual ~Flyweight() {}
    virtual void operation(const std::string& extrinsicState) const = 0;
};

class ConcreteFlyweight : public Flyweight {
public:
    void operation(const std::string& extrinsicState) const override {
        std::cout << "ConcreteFlyweight operation with extrinsic state: " << extrinsicState << std::endl;
    }
};

class FlyweightFactory {
private:
    std::map<std::string, Flyweight*> flyweights;
public:
    Flyweight* getFlyweight(const std::string& intrinsicState) {
        auto it = flyweights.find(intrinsicState);
        if (it == flyweights.end()) {
            flyweights[intrinsicState] = new ConcreteFlyweight();
        }
        return flyweights[intrinsicState];
    }
};
13.策略模式 (Strategy Pattern) 

定义一系列算法,把它们一个个封装起来,并使它们可以互换。

class Strategy {
public:
    virtual ~Strategy() {}
    virtual void algorithmInterface() const = 0;
};

class ConcreteStrategyA : public Strategy {
public:
    void algorithmInterface() const override {
        std::cout << "ConcreteStrategyA algorithm interface." << std::endl;
    }
};

class ConcreteStrategyB : public Strategy {
public:
    void algorithmInterface() const override {
        std::cout << "ConcreteStrategyB algorithm interface." << std::endl;
    }
};

class Context {
private:
    Strategy* strategy;
public:
    Context(Strategy* strategy) : strategy(strategy) {}
    void setStrategy(Strategy* strategy) {
        this->strategy = strategy;
    }
    void contextInterface() {
        strategy->algorithmInterface();
    }
};
14.模板方法模式 (Template Method Pattern) 

在方法中定义一个算法的骨架,而将一些步骤的执行延迟到子类中。

class AbstractClass {
protected:
    void primitiveOperation1() const {
        std::cout << "AbstractClass primitiveOperation1." << std::endl;
    }
    void primitiveOperation2() const {
        std::cout << "AbstractClass primitiveOperation2." << std::endl;
    }
public:
    void templateMethod() const {
        primitiveOperation1();
        primitiveOperation2();
    }
};

class ConcreteClass : public AbstractClass {
protected:
    void primitiveOperation1() const override {
        std::cout << "ConcreteClass primitiveOperation1." << std::endl;
    }
    void primitiveOperation2() const override {
        std::cout << "ConcreteClass primitiveOperation2." << std::endl;
    }
};
 15.观察者模式 (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 detach(Observer* observer) {
        observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    }

    void notify() {
        for (auto* observer : observers) {
            observer->update();
        }
    }
};

class ConcreteObserver : public Observer {
public:
    void update() override {
        // 更新逻辑
    }
};
16.迭代器模式 (Iterator Pattern) 

顺序访问一个聚合对象中的各个元素,不暴露其内部的表示。

class Iterator {
public:
    virtual bool hasNext() = 0;
    virtual void next() = 0;
    virtual void first() = 0;
    virtual void last() = 0;
};

class Aggregate {
public:
    virtual Iterator* createIterator() = 0;
};

class ConcreteAggregate : public Aggregate {
private:
    std::vector<int> items;

public:
    void add(int item) {
        items.push_back(item);
    }

    Iterator* createIterator() override {
        return new ConcreteIterator(this);
    }
};

class ConcreteIterator : public Iterator {
private:
    ConcreteAggregate* aggregate;
    int position;

public:
    ConcreteIterator(ConcreteAggregate* aggregate) : aggregate(aggregate), position(0) {}

    bool hasNext() override {
        return position < aggregate->items.size();
    }

    void next() override {
        position++;
    }

    void first() override {
        position = 0;
    }

    void last() override {
        position = aggregate->items.size() - 1;
    }
};
17.中介者模式 (Mediator Pattern) 

用一个中介对象来封装一系列对象之间的交互。

class Mediator {
public:
    virtual void send(const std::string& message, Colleague* sender) = 0;
};

class Colleague {
protected:
    Mediator* mediator;

public:
    Colleague(Mediator* mediator) : mediator(mediator) {}

    void setMediator(Mediator* mediator) {
        this->mediator = mediator;
    }

    virtual void send(const std::string& message) = 0;
    virtual void receive(const std::string& message) = 0;
};

class ConcreteMediator : public Mediator {
private:
    std::vector<Colleague*> colleagues;

public:
    void addColleague(Colleague* colleague) {
        colleagues.push_back(colleague);
    }

    void send(const std::string& message, Colleague* sender) override {
        for (auto* colleague : colleagues) {
            if (colleague != sender) {
                colleague->receive(message);
            }
        }
    }
};

class ConcreteColleague : public Colleague {
public:
    ConcreteColleague(Mediator* mediator) : Colleague(mediator) {}

    void send(const std::string& message) override {
        mediator->send(message, this);
    }

    void receive(const std::string& message) override {
        // 接收消息的逻辑
    }
};
18.命令模式 (Command Pattern)

将请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化。 

class Command {
public:
    virtual void execute() = 0;
};

class Receiver {
public:
    void action() {
        // 执行具体操作
    }
};

class ConcreteCommand : public Command {
private:
    Receiver* receiver;

public:
    ConcreteCommand(Receiver* receiver) : receiver(receiver) {}

    void execute() override {
        receiver->action();
    }
};

class Invoker {
private:
    Command* command;

public:
    void setCommand(Command* command) {
        this->command = command;
    }

    void executeCommand() {
        command->execute();
    }
};
19.备忘录模式 (Memento Pattern)

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 

class Memento {
private:
    int state;

public:
    Memento(int state) : state(state) {}

    int getState() const {
        return state;
    }
};

class Originator {
private:
    int state;

public:
    void setState(int state) {
        this->state = state;
    }

    int getState() const {
        return state;
    }

    Memento* createMemento() {
        return new Memento(state);
    }

    void restoreMemento(Memento* memento) {
        state = memento->getState();
    }
};

class Caretaker {
private:
    Memento* memento;

public:
    void setMemento(Memento* memento) {
        this->memento = memento;
    }

    Memento* getMemento() {
        return memento;
    }
};
 20.状态模式 (State Pattern)

允许一个对象在其内部状态发生改变时改变其行为。

class Context {
private:
    State* state;

public:
    void setState(State* state) {
        this->state = state;
    }

    void request() {
        state->handle(this);
    }
};

class State {
public:
    virtual void handle(Context* context) = 0;
};

class ConcreteStateA : public State {
public:
    void handle(Context* context) override {
        // 具体状态A的处理逻辑
    }
};

class ConcreteStateB : public State {
public:
    void handle(Context* context) override {
        // 具体状态B的处理逻辑
    }
};
21.访问者模式 (Visitor Pattern) 

为一个对象结构(如组合结构)增加新能力。

class Element {
public:
    virtual void accept(Visitor* visitor) = 0;
};

class ConcreteElementA : public Element {
public:
    void accept(Visitor* visitor) override {
        visitor->visitConcreteElementA(this);
    }
};

class ConcreteElementB : public Element {
public:
    void accept(Visitor* visitor) override {
        visitor->visitConcreteElementB(this);
    }
};

class Visitor {
public:
    virtual void visitConcreteElementA(ConcreteElementA* element) = 0;
    virtual void visitConcreteElementB(ConcreteElementB* element) = 0;
};

class ConcreteVisitor : public Visitor {
public:
    void visitConcreteElementA(ConcreteElementA* element) override {
        // 具体访问者访问A元素的逻辑
    }

    void visitConcreteElementB(ConcreteElementB* element) override {
        // 具体访问者访问B元素的逻辑
    }
};
22.解释器模式 (Interpreter Pattern)

定义一个语言的文法表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

class AbstractExpression {
public:
    virtual void interpret(Context* context) = 0;
};

class TerminalExpression : public AbstractExpression {
public:
    void interpret(Context* context) override {
        // 终端表达式的解释逻辑
    }
};

class NonterminalExpression : public AbstractExpression {
public:
    void interpret(Context* context) override {
        // 非终端表达式的解释逻辑
    }
};
23.责任链模式 (Chain of Responsibility Pattern) 

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

class Handler {
public:
    virtual void handleRequest(int request) = 0;
    virtual Handler* setNext(Handler* handler) = 0;
};

class ConcreteHandler1 : public Handler {
private:
    Handler* next;

public:
    Handler* setNext(Handler* handler) override {
        next = handler;
        return handler;
    }

    void handleRequest(int request) override {
        if (request >= 0 && request < 10) {
            std::cout << "ConcreteHandler1 handled request: " << request << std::endl;
        } else if (next != nullptr) {
            next->handleRequest(request);
        }
    }
};
// ConcreteHandler2, ConcreteHandler3 等类类似定义
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值