When you don't want a permanent binding between the functional abstraction and its implementation. When both the functional abstraction and its implementation need to extended using sub-classes. It is mostly used in those places where changes are made in the implementation does not affect the clien...