I'm a big proponent of the use of two nested adapters. My project provided a DBAccess interface that is to be used to access the database. To meet this requirement I built Data class that implements this interface and is used by the server and the standalone client.
I use a DataAdapter interface that adds the RemoteException to all the methods in DBAccess. This allows me to use Data across RMI, but this is no longer LSP substitutable for Data. At this point my network access would need to use a different interface than my local access.
To get around this I defined a DataProxy class that implements the DBAccess interface and is an Adapter in the GoF object meaning of that
word. This second Adapter creates a Proxy, which GoF defines as an Adapter that has an identical interface to its Adaptee.
All this lets me use a Factory Method to pick either a Data or DataProxy instance based on the mode and allows both the networked client and the standalone client to use the same DBAccess interface.