Delegation allows the behaviour of an object to be defined in terms of the behaviour of another object.  The term ‘delegation’ refers to the delegation of responsibility. The primary emphasis of delegation is on message passing where an object could delegate responsibility of a message it couldn’t handle to objects that potentially could (its delegates).

The idea is that you need to be able to invoke a piece of code, but that piece of code you’re going to invoke isn’t known until runtime. So you use a “delegate” for that purpose. Delegates come in handy for things like event handlers, and such, where you do different things based on different events, for example.

It is a technique where an object expresses certain behavior to the outside but in reality delegates responsibility for implementing that behaviour to an associated object. This sounds at first very similar to the proxy pattern, but it serves a much different purpose. Delegation is an abstraction mechanism which centralizes object (method) behaviour.