- •1. Событийно-управляемое приложение: событие, типы событий, сообщение, обработчик, механизм обмена сообщениями, очередь сообщений.
- •3. Жизненный цикл объектов: создание, уничтожение, конструкторы, деструкторы. Автоматическое управление памятью. Утечка памяти. Создание объектов с помощью различных конструкторов.
- •4. Наследование, типы видимости, типы наследования. Композиция, агрегация, ассоциация, зависимость. Композиция или наследование, в чём отличие и в чём похожесть.
- •6. Полиморфизм: переопределение и перекрытие методов. Вызов унаследованных методов. Варианты реализации в разных языках. Виртуальный деструктор.
- •7. Приведение типов. Правила, цель, стандартные приемы. Самостоятельная реализация, варианты реализации в разных языках.
- •8.Grasp-паттерны: информационный эксперт, низкая связность, высокое зацепление. Антипаттерны.
- •Золотой молоток (Golden hammer)
- •9. Бесклассовое (прототипно-ориентированное) ооп
- •10. Множественное наследование, интерфейсы и примеси (mixins).
- •11. Делегирование, объектная шизофрения.
- •13. Solid – принципы: sol.
- •14. Solid – принципы: id.
- •15. Объектная интроспекция и рефлексия.
- •16. Язык uml (диаграммы классов, состояний, последовательностей).
- •17. Архитектура Model–View–Controller (mvc) и её варианты. Самый простой способ её нарушить и исправить.
- •17. Одинарная и двойная диспетчеризация.
- •17. Покажите, как с помощью паттерна Prototype можно создавать копии любых объектов, не зная о конкретном классе каждого объекта.
- •18. Требуется создать такой класс, для которого в приложении не может существовать больше одного экземпляра. Опишите ситуацию, в которой это может потребоваться и решение с помощью паттерна Singleton
- •20. Покажите, как с помощью паттерна Decorator динамически (во время выполнения программы) видоизменять поведение объектов.
- •22. Инкапсулируйте любое действие в программе в отдельный объект, и покажите, как паттерн Command позволяет при этом манипулировать такими объектами и реализовывать отмену действий.
- •25. Покажите, как с помощью паттерна Observer можно реализовать динамическую (в момент работы программы) подписку одних объектов на уведомления об изменении других объектов.
- •26. Покажите, как с помощью паттерна Strategy реализуются различные варианты реализации одной и той же функциональности объекта.
- •30. Требуется в имеющейся функциональной иерархии объектов динамически изменять внутреннюю реализацию любого объекта. Покажите, как это может быть сделано с помощью паттерна Bridge.
- •31. Покажите, каким образом с помощью паттерна Visitor можно добавить новую функциональность целой иерархии потомков одного базового класса, не изменив ни одного класса этой иерархии.
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) }
