Delegates

From Rosetta Code
Revision as of 19:59, 3 October 2007 by rosettacode>Nirs (New page: {{task}} A delegate is a helper object used by another object. The delegator may delegate some operations to the delegate, and provide a default implementation when there is not delegate ...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Task
Delegates
You are encouraged to solve this task according to the task description, using any language you may know.

A delegate is a helper object used by another object. The delegator may delegate some operations to the delegate, and provide a default implementation when there is not delegate or the delegate does not implement the operation. This pattern is heavily used in Cocoa framework on Mac OS X

Objects responsibilities:

Delegator:

  • Keep an optional delegate instance.
  • Allow setting the delegate when creating the instance or later.
  • Delegate the methods "thing" and "other" to the delegate.
  • Provide default implementation if there is no delegate or the delegate does not implement one of the method.

Delegate:

  • Implement "thing".

Python

class Delegator:
    def __init__(self, delegate=None):
        self.delegate = delegate
    def thing(self):
         if hasattr(self.delegate, 'thing'):
             return self.delegate.thing()
         return 42
    def other(self):
         if hasattr(self.delegate, 'other'):
             return self.delegate.thing()
         return 5

class Delegate:
    def thing(self):
        return 37

if __name__ == '__main__':

    # No delegate
    a = Delegator()
    assert a.thing() == 42
    assert a.other() == 5

    # With delegate
    a.delegate = Delegate()
    assert a.thing() == 37
    assert a.other() == 5