Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- typedef int Coord;
- struct Point {
- Coord x, y;
- Point(Coord x, Coord y) : x( x ), y( y ){}
- Point() : x( 0 ), y( 0 ){}
- };
- //Целеви клас - дефинира желания интерфейс
- class Shape {
- public:
- Shape(){}
- virtual void getBoundingBox(Point& topLeft, Point& bottomRight) const = 0;
- };
- //Адаптиран клас - доставя функционалност
- class TextView {
- Coord _x, _y, _width, _height;
- public:
- TextView(Coord x, Coord y, Coord width, Coord height)
- : _x( x ), _y( y ), _width( width ), _height( height ) {}
- //Член-функциите са виртуални, за да може да се демонстрира
- //обектният адаптер с обект от производен клас.
- virtual void getOrigin(Coord& x, Coord& y) const {
- x = _x; y = _y;
- };
- virtual void getExtent(Coord& width, Coord& height) const {
- width = _width; height = _height;
- }
- virtual bool isEmpty() const {
- return _width == 0 || _height == 0;
- }
- };
- //Наследяващ клас на адаптирания клас:
- class TextView1:public TextView {
- public:
- TextView1(Coord x, Coord y, Coord width, Coord height)
- : TextView( x, y, width, height) {}
- //Не припокрива нищо (имитация), но можеше да припокрива
- };
- // Адаптер на клас
- // Наследява публично от целевия клас и частно - от адаптирания.
- // С това се скрива интерфейсът на адаптирания клас.
- class TextShape : public Shape, private TextView {
- public:
- TextShape(Coord x, Coord y, Coord width, Coord height)
- : TextView(x, y, width, height) {}
- virtual ~TextShape(){}
- //Припокриване на член-функцията от целевия клас.
- void getBoundingBox(Point& topLeft, Point& bottomRight) const {
- Coord x, y, w, h;
- //използва се адаптираният интерфейс за получаване на данни
- getOrigin(x, y);
- getExtent(w, h);
- //формират се целевите данни
- topLeft = Point(x, y);
- bottomRight = Point(x + h, y + w);
- }
- //директно използване при съвпадение на интерфейса и функционалността
- bool isEmpty() const {
- return TextView::isEmpty();
- }
- };
- // Адаптер на обекти
- class TextShape2 : public Shape {
- TextView* _text; //указател към обект от адаптирания клас
- //или от негов клас - наследник
- public:
- TextShape2(TextView* t) : _text( t ){}
- virtual ~TextShape2 (){};
- //Адаптирана функция
- void getBoundingBox(Point& topLeft, Point& bottomRight) const {
- Coord x, y, w, h;
- //извикване на функции от адаптирания клас, независимо кой точно е:
- _text->getOrigin(x, y);
- _text->getExtent(w, h);
- //формиране на целевите данни
- topLeft = Point(x, y);
- bottomRight = Point(x + h, y + w);
- }
- //извикване на функция
- virtual bool isEmpty() const {
- return _text->isEmpty();
- }
- };
- int main (int argc, char** argv){
- using namespace std;
- Coord x, y, w, h;
- //Създаване на обект от адаптирания клас
- TextView textView( 10, 10, 100, 100 );
- textView.getOrigin( x, y );
- textView.getExtent( w, h );
- //Отпечатване на неговите данни
- cout << "Original text view data: " << endl;
- cout << "x = " << x << endl;
- cout << "y = " << y << endl;
- cout << "w = " << w << endl;
- cout << "h = " << h << endl<<endl;
- //променливи, в които ще се получават резултатите
- //от целевия интерфейс
- Point topLeft, bottomRight;
- //Създаване на обект от адаптера на клас
- TextShape classAdapter( x, y, w, h );
- //извикване на целевия интерфейс
- classAdapter.getBoundingBox( topLeft, bottomRight );
- cout << "Using class adapter: " << endl;
- cout << "top left = " << topLeft.x << ", " << topLeft.y << endl;
- cout << "bottom right = " << bottomRight.x << ", " << bottomRight.y << endl;
- cout<<endl;
- //Обект от производен на адаптирания клас
- TextView1 adapteeObj(20,20,200,200);
- //Създаване на адаптер през обект
- TextShape2 objectAdapter( &adapteeObj );
- //извикване на целевия интерфейс
- objectAdapter.getBoundingBox( topLeft, bottomRight );
- cout << "Using object adapter: " << endl;
- cout << "top left = " << topLeft.x << ", " << topLeft.y << endl;
- cout << "bottom right = " << bottomRight.x << ", " << bottomRight.y << endl;
- cout << endl << endl;
- system("pause");
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment