委托
在编程领域里,委托(Delegate) 这个概念其实并不复杂,你可以把它通俗地理解为“函数的引用”或者“类型安全的函数指针”。
它的核心思想是:把“方法(函数)”当作一个“变量”来传递。 就像你把一件具体的事情(比如“发快递”)委托给另一个人去做,你只关心他能不能做这件事,而不关心他具体是谁。
核心比喻:生活中的“委托” 假设你要举办一场派对,你需要有人负责“播放音乐”。 传统做法:你直接喊“张三,去放音乐!”(硬编码,直接调用具体函数)。 委托做法:你在门口贴个告示:“需要一个能播放音乐的人(定义委托类型)”。李四走过来说“我能放音乐”,你就把“播放音乐”这个任务交给他(实例化委托)。如果明天李四没空,王五来了,你依然可以把任务交给王五(替换委托目标)。
使用场景
开发者小A写了一个任务类,专门处理系统分发的任务。但是小A不知道谁在监视任务的执行状态,他也不想知道。于是他做了一个任务委托,专门往外抛消息,谁爱用就用,我不管了。
//下一节给出委托和event的具体实现
#include \”event.h\”
class Task
{
//任务编号
int m_nTaskId;
public:
Task()
{
m_nTaskId = 9;
}
//委托,声明函数签名。
GsDelegate<void(std::string, int)> OnTaskCompleted;
void startTask()
{
//执行任务。。。
//任务结束后,往外抛消息
OnTaskCompleted(\”Task Completed\”, m_nTaskId);
}
};
小A请婚假了,他要去遥远的赞比亚度蜜月,请了3个月假。小B收到领导指示,任务结束后要通知用户。他看了小A的实现,庆幸万分。能够做,而且还不要改小A的代码。于是小B写了一个任务监视类。
//下一节给出委托和event的具体实现
#include \”event.h\”
class TaskWatcher
{
public:
TaskWatcher(Task* pTask)
{
//绑定委托到本类实例的TaskEvent成员方法
pTask->OnTaskCompleted.Add(this, &TaskWatcher::TaskEvent);
}
void TaskEvent(std::string info, int id)
{
cout << \”Task \” << id << \” say :\” << info << endl;
}
};
以上就是委托的经典用法,说穿了就是解耦。
委托的模版实现
全是模版代码,可以仔细阅读,提高水平。也可以不阅读,知道怎么用就行了。
//delegateT.h
#if GS_DELEGATE_NUM_ARGS == 0
#define GS_DELEGATE_COMMA
#else
#define GS_DELEGATE_COMMA ,
#endif
#ifndef NULL
#define NULL 0
#endif
//————————————————————————-
// class Delegate<R (T1, T2, …, TN)>
template <class R GS_DELEGATE_COMMA GS_DELEGATE_TEMPLATE_PARAMS>
class GsDelegate<R (GS_DELEGATE_TEMPLATE_ARGS)>
{
// Declaractions
private:
class DelegateImplBase
{
// Fields
public:
DelegateImplBase* Previous; // singly-linked list
// Constructor/Destructor
protected:
DelegateImplBase() : Previous(NULL) { }
DelegateImplBase(const DelegateImplBase& other) : Previous(NULL) { }
public:
virtual ~DelegateImplBase() { }
// Methods
public:
virtual DelegateImplBase* Clone() const = 0;
virtual R Invoke(GS_DELEGATE_FUNCTION_PARAMS) const = 0;
};
template <class TFunctor>
struct Invoker
{
static R Invoke(const TFunctor& f GS_DELEGATE_COMMA GS_DELEGATE_FUNCTION_PARAMS)
{
return (const_cast<TFunctor&>(f))(G




