设计模式C++实现40讲(12)委托模式

文章目录

定义

在委托模式中,一个类(委托对象)将一些需要执行的操作委托给另一个类(委托方法),从而形成一种类似于回调函数的机制。委托模式的核心思想是将复杂的功能分解到不同的对象中去实现,降低单个对象的复杂度,从而提高系统的可维护性和可扩展性。

委托模式在实际中有着广泛的应用,在事件驱动编程、GUI 编程、多线程编程等领域都有着重要的作用。对于需要动态确定对象行为,或者对象结构发生变化时需要灵活地修改代码的情况下,委托模式是一种非常有用的技术手段。

委托模式有一个非常形象的比喻,那就是事件机制中的事件和事件处理器。

举个例子,比如我们在 UI 界面中可以设计一个按钮,当用户点击该按钮时,我们希望执行一些操作。此时,可以将按钮点击事件视为一个事件,而执行该操作的方法视为一个事件处理器。然后,我们可以使用委托模式的思路,将事件处理器通过委托的形式注册到事件中心,当事件发生时,事件中心就会调用所有已注册的事件处理器,以执行所需要的操作。

在这个比喻中,事件就是委托对象,事件处理器就是委托方法。事件中心就相当于上面提到的 Event 类,在其中管理委托列表、添加委托、移除委托和触发委托等操作。委托是一种能够让调用方与被调用方解耦的方式,它使得调用方无需关心被调用方具体实现细节,只需指定被调用方的方法名称和参数类型即可。

通过委托模式,我们可以有效地实现事件驱动的程序设计,并让程序更加易于扩展和维护。

实例

在这里插入图片描述

#include <iostream>
#include <vector>
#include <functional>

// 委托基类
class DelegateBase {
    
    
public:
    virtual ~DelegateBase() {
    
    }
    virtual void Invoke() = 0;
};

// 委托模板类
template <typename T>
class Delegate : public DelegateBase {
    
    
public:
    using FunctionType = std::function<T>;

    // 构造函数
    Delegate(FunctionType func) {
    
    
        m_func = func;
    }

    // 处理函数调用
    void Invoke() override {
    
    
        m_func();
    }

private:
    FunctionType m_func;
};

// 事件类
class Event {
    
    
public:
    // 添加委托
    template <typename T>
    void Add( std::function<T> func ) {
    
    
        m_delegates.emplace_back(new Delegate<T>(func));
    }

    // 触发事件
    void Invoke() {
    
    
        for (auto& delegate : m_delegates) {
    
    
            delegate->Invoke();
        }
    }

private:
    std::vector<std::unique_ptr<DelegateBase>> m_delegates;
};

int main()
{
    
    
    // 创建事件
    Event event;

    // 添加两个不同类型的委托
    event.Add<void()>([] {
    
     std::cout << "Hello, World!" << std::endl; });
    event.Add<void()>([] {
    
     std::cout << "Goodbye, World!" << std::endl; });

    // 触发事件
    event.Invoke();

    return 0;
}

猜你喜欢

转载自blog.csdn.net/HandsomeHong/article/details/129722807