'Design Patterns:
Elements of Reusable Object-Oriented Software'
Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides
‘This ... leads to the following principle of reusable object-oriented design:
Program to an interface, not an implementation.
Don't declare variables to be instances of particular concrete classes.
Instead, commit only to an interface defined by
an abstract class
[or an interface in Java].
You will find this to be a common theme
of the design patterns in this book.’
Another book that covers similar material is 'Patterns in Java: Volume 1' by Mark Grand.
‘One of the great qualities of object-oriented development is that you can vary the interfaces of classes independent of the implementation. Much of the power of object development comes from this property. However, few people make good use of it. Programming languages use a single construct, the class, which contains both interface and implementation. When you subclass, you inherit both. Using the interface as a separate construct is rarely used, which is a shame.’
'ChiMu OO and Java Development: Guidelines and Resources'
ChiMu Corporation
‘Use interfaces as the glue throughout your code instead of classes:
define interfaces to describe the exterior of objects
(i.e., their Type)
and type all variables, parameters, and return values to interfaces.
The most important reason to do this is
that interfaces focus on the client's needs:
interfaces define what functionality a client will receive from an Object
without coupling the client to the Object's implementation.
This is one of the core concepts to OO.’
http://www.chimu.com/publications/javaStandards/