定义
在委托模式中,一个类(委托对象)将一些需要执行的操作委托给另一个类(委托方法),从而形成一种类似于回调函数的机制。委托模式的核心思想是将复杂的功能分解到不同的对象中去实现,降低单个对象的复杂度,从而提高系统的可维护性和可扩展性。
委托模式在实际中有着广泛的应用,在事件驱动编程、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;
}