|
|
Introduction
Convert the interface of a class into another interface client expect.
Adapter lets classes work together that couldn't otherwise
because of imcompatible interfaces.
Participants:
Target
- defines the domain-specific interface.
- this participant can not be a class if the class adapter (see below) version is chosen.
Adaptee
- defines an existing interface that needs adapting.
Adapter
- adapts the interface of Adaptee to the Target interface.
- this participant can not be an interface.
- this participant can not be read-only.
There are two variations of the Adapter pattern: object adapter and class adapter:
- Class adapter
-
adapts Adaptee to Target by commiting to a concreate Adapter class. As a consequence,
a class adapter won't work when you want to adapt a class and all ats subclasses.
-
lets Adapter override some of Adaptee's behavior, since Adapter is a subclass of Adaptee.
-
introduces only one object, and no additional pointer indirection is needed to get to the adaptee.
- Object adapter
-
lets a single Adapter work with many Adaptees - that is, the Adaptee itself and all of its
subclasses (if any). The Adapter can also add functionality to all Adaptees at once.
-
makes it harder to override Adaptee behavior. It will require subclassing Adaptee and making
Adapter refer to the subclass rather than the Adaptee itself.
In the "Attribute" field you can specify the name of an attribute where Adapter keeps a reference
to the Adaptee object.
The "Initialization variant" option defines the kind of initialization of that attribute.
The "Copy documentation" option controls whether to copy JavaDoc comments from methods in interfaces
participating in the pattern to the stubs of these methods made by the pattern in classes implementing
such interfaces.
The "Create pattern links" option controls whether to generate additional links which can be used by this
pattern later to determine classes and interfaces participating in the pattern.
That means that if you selected this option and used the pattern to create a set of classes and interfaces,
the pattern invoked for some participant later (via the popup menu item "Choose Pattern...") will
automatically find (if it is possible) all other participants and fill in participant fields
with their names.
Also, if you applied the pattern with this option on and invoked the pattern
via the popup menu item "Choose Pattern..." for some participant later, the pattern
will have additional field called "Use selected class as", containing possible roles for the selected
element.
This option is very useful when you are planning to change something in the classes/interfaces
participating in the pattern. For example, if this option is on and after creation of the classes and
interfaces you
added several methods to certain interface-participant (and this change must be reflected somehow in other
participants), all you have to do is to select this
changed interface,
invoke the "Choose Pattern..." dialog for this element and select the original pattern. After that
the pattern will determine other participants and you will only have to press "Finish".
The pattern will modify all other classes and interfaces accordingly to your changes.
Applicability
Use Adapter pattern when
- you want to use an existing class, and its interface does not match the one
you need.
- you want to create a reusable class that cooperates with unrelated or unforeseen classes, that is,
classes that don't necessarily have compatible interfaces.
- (object adapter only) you need to use several existing subclasses, but it's impractical
to adapt their interface by subclassing every one. An object adapter can adapt the interface of its
parent class.
|