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".

Delegator ::= Object clone tap {
  self delegate := Nil.
  self clone := {
    Parents above (parent self, 'clone) call tap {
      self delegate := #'(self delegate).
    }.
  }.
  self operation := {
    localize.
    if { this delegate slot? 'thing. } then {
      this delegate thing.
    } else {
      "default implementation".
    }.
  }.
}.
 
Delegate ::= Object clone tap {
  self thing := "delegate implementation".
}.
 
;; No delegate
foo := Delegator clone.
println: foo operation. ;; "default implementation"
 
;; Delegate which lacks `thing`
foo delegate := Object.
println: foo operation. ;; "default implementation"
 
;; Delegate which implements `thing`
foo delegate := Delegate.
println: foo operation. ;; "delegate implementation"