Intent -
Provide a unified interface to a set of interfaces in a
subsystem. Facade defines a higher-level interface that
makes the subsystem easier to use.
Problem -
you want to provide a simple interface to a complex subsystem
there are many dependencies between clients and the
implementation classes of an abstraction
you want to layer your subsystems
Solution -
Participants and Collaborators
Facade
subsystem classes (pattern independent)
Consequences
shields clients from subsystem components
promotes weak coupling between the subsystem and its
clients
doesn't prevent applications from using subsystem
classes if they need to
Implementation
Reducing client-subsystem coupling - you can make
the Facade an abstract class and provide different
concrete classes
for different implementations of the subsystem. The
client then doesn't need to know when you change
subsystems.