Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_Otvety.docx
Скачиваний:
32
Добавлен:
07.04.2025
Размер:
2.59 Mб
Скачать

22. Инкапсулируйте любое действие в программе в отдельный объект, и покажите, как паттерн Command позволяет при этом манипулировать такими объектами и реализовывать отмену действий.

Команда — это поведенческий паттерн проектирования, который превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить запросы в очередь, логировать их, а также поддерживать отмену операций.

class Point{ private : int _x, _y; public: Point(x,y) {…} void move(int dx, int dy){…}};

class Command{ public : virtual void execute(Point* selection) = NULL; virtual void unexecute() = NULL; virtual Command * clone() = NULL;};

class MoveCommand : public Command{ private : Point * selection; int _dx; int _dy; public: MoveCommand(int dx, int dy){ _dx=dx; _dy=dy; selection=NULL;} virtual void execute (Point* selection){ this->selection = selection; if (this->selection != NULL) this->selection->move(_dx, _dy); virtual void unexecute(){ if(selection != NULL) selection->move(-_dx,-_dy);} virtual Command * clone() { return new MoveCommand(_dx, _dy):}};

int main(){ Command * up = new MoveCommand(10, 0); Point * selection = new Point(0,0); up->execute(selection); //selection 10, 0 up->execute(selection); //selection 20, 0 up->unexecute(selection); //selection 10, 0 //копии выполненных команд можно помещать в стек для сохранения истории.}

23. Требуется реализовать возможность унифицированного обхода разнотипных контейнеров в одной программе. Покажите, как это может быть реализовано с помощью паттерна Iterator. Покажите, как подобная функциональность реализована в стандартных контейнерах библиотеки STL.

Итератор — это поведенческий паттерн проектирования, который даёт возможность последовательно обходить элементы составных объектов, не раскрывая их внутреннего представления.

class Iterator{ public: virtual void first() = NULL; virtual int getCurItem() = NULL; virtual void setCurItem(int item) = NULL; virtual void next() = NULL; virtual void isEOL() = NULL;};

class Array{ private : int*_values; int _size; public: Iterator *createIterator(){return new ConcreateIterator(this);}; Array(int size) { _size = size; _values = new int[_size];} int getCount(){return _size}; int getValue(int index){return _values[index];} void setValue(int index, int item){ _values[index] = item;}

class ConcreateIterator : public Iterator{ private : Array *arr; int curIndex; public : ConcreateIterator(Array *_arr){ arr=_arr; cirIndex = 0;} void first() {curIndex = 0;} int getCurItem() { if (!isEOL()) return arr->getValue(curIndex); else return 0;} void setCurItem(int item){ if (!isEOL()) arr->setValue(curItem, item);} void next(){ if (!isEOL()) curIndex++; bool isEOL() { return curIndex==arr->getCount();}};

int main(){ Array arr(10); for (int I = 0; i< arr.getCount(); i++) arr.setValue(I, i); Iterator * it = arr.createIterator(); for (it->first(); !it->isEOL(); it->next()) cout<<it->getCurItem(); }

24. Требуется сохранять и восстанавливать полное состояние некоторого объекта, ничего не знаяЫ о внутренней структуре этого объекта. Покажите, как эта задача может быть реализована с помощью паттерна Memento.

Снимок — это поведенческий паттерн проектирования, который позволяет сохранять и восстанавливать прошлые состояния объектов, не раскрывая подробностей их реализации.

class Memento{ private : friend class Point; int _x, _y; void setState(int x, int y) {_x=x; _y=y} void getState(int &x, int &y) {x=_x; y=_y;} public : Memento(){ _x=0; _y=0;}};

class Point{ private : int _x, _y; public : Point(int x, int y) {_x=x; _y=y;} void move(int dx, int dy) {_x=_x+dx; _y=_y+dy;} virtual Memento *createMemento(){ Memento *memento = new Memento(); memento -> setState(_x,_y); return memento;} virtual void updateFromMemento(Memento *memnto){ memento->getState(_x,_y);}};

int main(){ Point *p = new Point(10,20); //p(10,20) Memento * memento = p->createMemento(); p->move(5,5);//p(15,25) p->updateFromMemento(memento);//p(10,20) }

Соседние файлы в предмете Объектно ориентированное программирование