Whenever there is some portion of an application that is the product of a difficult or uncertain design decision, or that takes a dependency on an external system that has a fair chance of changing, isolating that part of the application behind a generic interface reduces the chaos in your app when things do eventually need to change.
See also: See also: http://www.cs.umd.edu/class/spring2003/cmsc838p/Design/criteria.pdf