VasilM

oop_adaptor

May 19th, 2013
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.18 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. typedef int Coord;
  4.  
  5. struct Point {
  6.     Coord x, y;
  7.     Point(Coord x, Coord y) : x( x ), y( y ){}
  8.     Point() : x( 0 ), y( 0 ){}
  9. };
  10.  
  11. //Целеви клас - дефинира желания интерфейс
  12. class Shape {
  13. public:
  14.     Shape(){}
  15.     virtual void getBoundingBox(Point& topLeft, Point& bottomRight) const = 0;
  16. };
  17.  
  18. //Адаптиран клас - доставя функционалност
  19. class TextView {
  20.     Coord _x, _y, _width, _height;
  21. public:
  22.     TextView(Coord x, Coord y, Coord width, Coord height)
  23.     : _x( x ), _y( y ), _width( width ), _height( height )  {}
  24.    //Член-функциите са виртуални, за да може да се демонстрира
  25.    //обектният адаптер с обект от производен клас.
  26.    virtual void getOrigin(Coord& x, Coord& y) const {
  27.         x = _x;  y = _y;
  28.     };
  29.     virtual void getExtent(Coord& width, Coord& height) const {
  30.         width = _width;  height = _height;
  31.     }
  32.     virtual bool isEmpty() const {
  33.         return _width == 0 || _height == 0;
  34.     }
  35. };
  36.  
  37.  
  38. //Наследяващ клас на адаптирания клас:
  39. class TextView1:public TextView {
  40. public:
  41.     TextView1(Coord x, Coord y, Coord width, Coord height)
  42.     : TextView( x, y, width, height) {}
  43.     //Не припокрива нищо (имитация), но можеше да припокрива
  44. };
  45.  
  46. // Адаптер на клас
  47. // Наследява публично от целевия клас и частно - от адаптирания.
  48. // С това се скрива интерфейсът на адаптирания клас.
  49. class TextShape : public Shape, private TextView {
  50. public:
  51.     TextShape(Coord x, Coord y, Coord width, Coord height)
  52.     : TextView(x, y, width, height)    {}
  53.     virtual ~TextShape(){}
  54.     //Припокриване на член-функцията от целевия клас.
  55.         void getBoundingBox(Point& topLeft, Point& bottomRight) const {
  56.         Coord x, y, w, h;
  57.     //използва се адаптираният интерфейс за получаване на данни
  58.         getOrigin(x, y);
  59.         getExtent(w, h);
  60.     //формират се целевите данни
  61.         topLeft = Point(x, y);
  62.         bottomRight = Point(x + h, y + w);
  63.     }
  64.    //директно използване при съвпадение на интерфейса и функционалността
  65.    bool isEmpty() const {
  66.         return TextView::isEmpty();
  67.    }
  68. };
  69.  
  70. // Адаптер на обекти
  71. class TextShape2 : public Shape {
  72.     TextView* _text; //указател към обект от адаптирания клас
  73.     //или от негов клас - наследник
  74. public:
  75.     TextShape2(TextView* t) : _text( t ){}
  76.     virtual ~TextShape2 (){};
  77.     //Адаптирана функция
  78.     void getBoundingBox(Point& topLeft, Point& bottomRight) const {
  79.         Coord x, y, w, h;
  80.     //извикване на функции от адаптирания клас, независимо кой точно е:
  81.         _text->getOrigin(x, y);
  82.         _text->getExtent(w, h);
  83.     //формиране на целевите данни
  84.         topLeft = Point(x, y);
  85.         bottomRight = Point(x + h, y + w);
  86.     }
  87.     //извикване на функция
  88.     virtual bool isEmpty() const {
  89.         return _text->isEmpty();
  90.     }
  91. };
  92.  
  93. int main (int argc, char** argv){
  94.     using namespace std;
  95.     Coord x, y, w, h;
  96.     //Създаване на обект от адаптирания клас
  97.     TextView textView( 10, 10, 100, 100 );
  98.     textView.getOrigin( x, y );
  99.     textView.getExtent( w, h );
  100.     //Отпечатване на неговите данни
  101.     cout << "Original text view data: " << endl;
  102.     cout << "x = " << x << endl;
  103.     cout << "y = " << y << endl;
  104.     cout << "w = " << w << endl;
  105.     cout << "h = " << h << endl<<endl;
  106.     //променливи, в които ще се получават резултатите
  107.     //от целевия интерфейс
  108.     Point topLeft, bottomRight;
  109.     //Създаване на обект от адаптера на клас
  110.     TextShape classAdapter( x, y, w, h );
  111.     //извикване на целевия интерфейс
  112.     classAdapter.getBoundingBox( topLeft, bottomRight );
  113.     cout << "Using class adapter: " << endl;
  114.     cout << "top left = " << topLeft.x << ", " << topLeft.y << endl;
  115.     cout << "bottom right = " << bottomRight.x << ", " << bottomRight.y << endl;
  116.     cout<<endl;
  117.     //Обект от производен на адаптирания  клас
  118.     TextView1 adapteeObj(20,20,200,200);
  119.     //Създаване на адаптер през обект
  120.     TextShape2 objectAdapter( &adapteeObj );
  121.     //извикване на целевия интерфейс
  122.     objectAdapter.getBoundingBox( topLeft, bottomRight );
  123.     cout << "Using object adapter: " << endl;
  124.     cout << "top left = " << topLeft.x << ", " << topLeft.y << endl;
  125.     cout << "bottom right = " << bottomRight.x << ", " << bottomRight.y << endl;
  126.     cout << endl << endl;
  127.     system("pause");
  128.     return EXIT_SUCCESS;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment