📜  C++中的复合设计模式(1)

📅  最后修改于: 2023-12-03 14:39:58.180000             🧑  作者: Mango

C++中的复合设计模式

复合设计模式是一种使用多个设计模式结合起来解决复杂问题的方法。它通常在一个较高级别上组合设计模式,并将它们作为单个解决方案来使用。本文将介绍一些常见的复合设计模式以及它们的实现方式。

1. 适配器和装饰器模式

适配器模式和装饰器模式都是结构型模式,它们可以被组合使用来解决某些问题。适配器模式用于将一个类的接口转换为另一个类接口,而装饰器模式用于为一个对象添加新的方法或行为。

实现方式

首先,定义一个抽象基类,包含要实现的方法。然后,使用适配器模式来实现另一个类,该类实现了相同的接口,但是实际上调用的是另一个类。然后,使用装饰器模式来在这个类上添加更多的方法或行为。

示例代码如下:

class IObject
{
public:
    virtual void doSomething() = 0;
};

class Object : public IObject
{
public:
    void doSomething() override {}
};

class IAdapter : public IObject
{
public:
    IAdapter(std::shared_ptr<Object> object) : m_object(object) {}
    virtual void doSomething() override {}

protected:
    std::shared_ptr<Object> m_object;
};

class Adapter : public IAdapter
{
public:
    Adapter(std::shared_ptr<Object> object) : IAdapter(object) {}

    void doSomething() override
    {
        m_object->doSomething();
    }
};

class IDecorator : public IObject
{
public:
    IDecorator(std::shared_ptr<IObject> obj) : m_obj(obj) {}
    virtual void doSomething() override {}

protected:
    std::shared_ptr<IObject> m_obj;
};

class Decorator : public IDecorator
{
public:
    Decorator(std::shared_ptr<IObject> obj) : IDecorator(obj) {}

    void doSomething() override
    {
        m_obj->doSomething();
        std::cout << "Decorated method called" << std::endl;
    }
};
使用示例

现在,我们可以通过以下方式使用这些类:

int main()
{
    std::shared_ptr<Object> obj = std::make_shared<Object>();
    std::shared_ptr<IAdapter> adapter = std::make_shared<Adapter>(obj);
    std::shared_ptr<IDecorator> decorator = std::make_shared<Decorator>(adapter);
    decorator->doSomething();
    return 0;
}

输出将会是:

Decorated method called
2. 观察者和单例模式

观察者和单例模式通常被用于实现系统的通知和更新功能。观察者模式用于管理和通知多个对象,而单例模式可以确保只有一个对象可以访问和维护这些对象。

实现方式

我们可以使用单例模式来管理多个观察者对象,然后在需要通知更新时,使用观察者模式通知所有注册的观察者对象。

示例代码如下:

class Singleton
{
public:
    static Singleton& instance()
    {
        static Singleton instance;
        return instance;
    }

    void attach(std::shared_ptr<IObserver> observer)
    {
        m_observers.push_back(observer);
    }

    void detach(std::shared_ptr<IObserver> observer)
    {
        std::remove(m_observers.begin(), m_observers.end(), observer);
    }

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

private:
    std::vector<std::shared_ptr<IObserver>> m_observers;

    Singleton() {}
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};

class IObserver
{
public:
    virtual void update() = 0;
};

class Observer : public IObserver
{
public:
    void update() override {}
};
使用示例

现在,我们可以通过以下方式使用这些类:

int main()
{
    std::shared_ptr<Observer> observer = std::make_shared<Observer>();
    Singleton::instance().attach(observer);
    Singleton::instance().notify();
    Singleton::instance().detach(observer);
    return 0;
}
结论

使用复合设计模式可以解决复杂问题并实现更好的灵活性和可扩展性。以上介绍的仅是一些最常见的复合设计模式,程序员可以根据自己的需要使用这些模式,或者根据自己的情况实现新的复合设计模式。