Layering & Contract Philosophy With additional indirection
Adaptee object just is as a member. Adaptee object just relies on Adapter object.
class CAdaptee { public: void theExistingAndIncompatibleMethod(){ … } ; } class CTarget { public: virtual void theNewMethod() = 0; } class CAdapter: public CTarget, CAdaptee { public: void theNewMethod() { this->theExistingAndIncompatibleMethod(); }; } class CAdapter: public CTarget { public: void theNewMethod() { CAdaptee object; object.theExistingAndIncompatibleMethod(); }; } class client { public: void operation() { CTarget *pTarget = new CAdapter; pTarget->theNewMethod();} }
Applicability
Use the Adapter pattern when
- you want to use an existing class having a incompatible method with the new interface from the one you want to use, 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/making as subclass every one. An object adapter can adapt the interface of its parent class.
Participants
- Target (Shape): defines the domain-specific interface that Client uses.
- Client (DrawingEditor): collaborates with objects conforming to the Target interface.
- Adaptee (TextView): defines an existing interface that needs adapting.
- Adapter (TextShape): adapt the interface of Adaptee to the Target interface.
Collaborations
- Clients call operations on an Adapter instance. In turn, the adapter calls Adaptee operations that carry out the request.