Obiektowe metody projektowania systemów Adapter
Wstęp: „Dostosowanie interfejsu klasy do interfejsu, którego oczekuje użytkownik. Adapter umożliwia współprace klas, która bez jego zastosowania nie byłaby możliwa ze względu na ich niezgodne interfejsy.” Intencja Adaptera wg Bandy Czworga:
Plan: Wstęp Adapter obiektów Adapter klas Przykład: adapter obiektów Przykład: adapter klas Podsumowanie Bibliografia
Wzorzec Adapter konwertuje interfejs jednej klasy na interfejs innej klasy. Używamy tego wzorca, jeśli chcemy, żeby dwie niezwiązane ze sobą klasy współpracowały ze sobą w jednym programie. Koncepcja wzorca Adaptera jest bardzo prosta: piszemy klasę, która posiada wymagany interfejs, a następnie zapewniamy jej komunikację z klasą, która ma inny interfejs. Istnieją dwa sposoby realizacji: poprzez dziedziczenie i poprzez kompozycję. Adapter
Adapter obiektów Pierwotną klasę zawieramy wewnątrz nowej i tworzymy metody wymaganego interfejsu realizujące wywołania metod klasy wewnętrznej.
Adapter klas Z klasy, która ma niezgodny interfejs wywodzimy klasę pochodną i dopisujemy nowe metody tak, by uzyskać wymagany interfejs.
Przykład : adapter obiektów
class Okrag : public Figura { private: XXOkrag *xxokrag; public: Okrag( ); void Wyswietl( ); … } Okrag::Okrag( ) { … xxokrag=new XXOkrag; } void Okrag::Wyswietl( ) { xxokrag->Wyswietlaj( ); } … Przykład c.d.: implementacja
Przykład: adapter klas
Przykład c.d. : implementacja class Rectangle { public: virtual void draw( ) = 0; }; class AdapteeRectangle { public: AdapteeRectangle( int x1,int y1, int x2, int y2 ) :x1_(x1), y1_ (y1), x2_(x2), y2_(y2) { }; void oldDraw() { cout (" << x2_ << "," << y2_ << ")" << endl; } private: int x1_, x2_, y1_, y2_; };
Przykład c.d. class RectangleAdapter : public Rectangle, private AdapteeRectangle { public: RectangleAdapter( int x, int y, int width, int height ) : AdapteeRectangle( x, y, x+width, y+height ) { cout << "RectangleAdapter: (" << x << "," << y<< "), width = " << width << ", height = " << height << endl; }; void draw( ) { oldDraw( ); } }; void main ( void ) { Rectangle* r = new RectangleAdapter( 120, 200, 60, 40 ); r->draw( ); }
Podsumowanie: Adapter stanowi przykład niezwykle użyte- cznego wzorca projektowego, którego działanie polega na dostosowywaniu interfejsu istniejących już obiektów do interfejsu, który jest wymagany przez inne obiekty. Jego implementacja polega na opakowaniu istniejących klas za pomocą nowej klasy o pożądanym interfejsie.
Bibliografia: Stroustrup B.: The C++ Programming Language, Addison-Wesley, 2004 Alan Shalloway, James R. Trott: Projektowanie zorientowane obiektowo. Wzorce projektowe, patterns.html
...i to by było tyle na dzisiaj!