Design Pattern ->Adaptor

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.
 
原文地址:https://www.cnblogs.com/iiiDragon/p/3268444.html