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

include FMS-SI.f
 
:class delegate
  :m thing ." delegate implementation" ;m
;class
 
delegate slave
 
:class delegator
  ivar del  \ object container
  :m !: ( n -- ) del ! ;m
  :m init: 0 del ! ;m
  :m default ." default implementation" ;m
  :m operation 
     del @ 0= if self default exit then
     del @ has-meth thing
     if del @ thing
     else self default
     then ;m
;class
 
delegator master 
 
\ First, without a delegate
master operation \ => default implementation
 
\ then with a delegate that does not implement "thing"
object o  
o master !:
master operation \ => default implementation
 
\ and last with a delegate that implements "thing"
slave master !:
master operation \ => delegate implementation
 