A delegate is a helper object used by another object. The delegator may send the delegate certain messages, and provide a default implementation when there is no delegate or the delegate does not respond to a message. This pattern is heavily used in Cocoa framework on Mac OS X. See also wp:Delegation pattern.

Objects responsibilities:

Delegator:

 Keep an optional delegate instance.
 Implement "operation" method, returning the delegate "thing" if the delegate respond to "thing", or the string "default implementation".
Delegate:

 Implement "thing" and return the string "delegate implementation"
Show how objects are created and used. First, without a delegate, then with a delegate that does not implement "thing", and last with a delegate that implements "thing".

text
thing(void)
{
    return "delegate implementation";
}
 
text
operation(record delegator)
{
    text s;
 
    if (r_key(delegator, "delegate")) {
        if (r_key(delegator["delegate"], "thing")) {
            s = call(r_query(delegator["delegate"], "thing"));
        } else {
            s = "default implementation";
        }
    } else {
        s = "default implementation";
    }
 
    return s;
}
 
integer
main(void)
{
    record delegate, delegator;
 
    o_text(operation(delegator));
    o_byte('\n');
 
    r_link(delegator, "delegate", delegate);
    o_text(operation(delegator));
    o_byte('\n');
 
    r_put(delegate, "thing", thing);
    o_text(operation(delegator));
    o_byte('\n');
 
    return 0;
}