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

25. Покажите, как с помощью паттерна Observer можно реализовать динамическую (в момент работы программы) подписку одних объектов на уведомления об изменении других объектов.

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

class Subject;

class Observer{ public: virtual void onSubjectChanged(Subject *who) = NULL;};

class Subject{ private: vector<Observer*> *_observers; public : Subject(){ _observers = new vector<Observers*>;} void AddObserver (Observer* o){ _observers->push_back(o);} void notifyEveryOne(){ vector<Observer*>::iterator I; for (I = _observers->begin(); i!= observers->end(); i++) (*i)->onSubjectChanged(this);

class Animal : public Subject{ public: char *lastsound, *name; Animal(char *aname) {name = aname; lastsound = “”;} void say(shar* sound){ lastsound = sound; cout << sound; notifyEveryOne();}};

class Child : public Observer{ public: char *name; Child(char * cname) {name = cname;} void onSubjectChanged(Subject * who) { cout << “Child” + name + “say” + who->name + “says” + who->lastSound;}};

26. Покажите, как с помощью паттерна Strategy реализуются различные варианты реализации одной и той же функциональности объекта.

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

class Strategy{ public: virtual int execute(int x) = NULL;};

class Context{ private: Strategy * _strategy; public: Contex(){ _strategy = NULL;}; void setStraregy(Strategy * strategy){ delete this->_strategy; _strategy = strategy;}; void doSomething(int _x){ cout << _strategy->execute(x);}};

class StrategyInc : public Strategy{ public: int execute(int x){ return x+1;}};

class StrategyQrt : public Strategy{ public: int execute(int x){ return x*x;}};

int main(){ Strategy * inc = new StrategyInc(); Strategy * qrt = new StrategyQrt(); Context * context = new Context(); context->setStrategy(inc); context->doSomething(5); //Output: 6 context->setStrategy(qrt); context->doSomething(5); //Ouput: 25}

27. Метод FOO() у класса A выполняет действия D1, D2, DX и D4 именно в таком порядке. Метод FOO() у класса B выполняет действия D1, D2, DY и D4 именно в таком порядке. Покажите, как можно избавиться от дублирования кода с помощью паттерна Template Method.

Шаблонный метод — это поведенческий паттерн проектирования, который определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы. Паттерн позволяет подклассам переопределять шаги алгоритма, не меняя его общей структуры.

class TemplateClass{ public : void TemplateMethod{ D1(); D2(); DD(); D4();} void DD() = NULL;};

class A : public TemplateClass{ public : void DD() { DX();}};

class B : public TemplateClass{ public : void DD() {DX();}};

int Main(){ A * a = new A(); B * b = new B(); a.TemplateMethod(); //D1, D2, DX, D4 b.TemplateMethod(); //D1, D2, Dy, D4

28. Имеется объект класса X, реализующий интерфейс IX. Имеется программа, которая умеет пользоваться методами интерфейса IY. Покажите, как с помощью паттерна Adapter можно научить программу пользоваться объектом класса X.

Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.

Есть два варианта. В первом мы публично наследуемся от интерфейса, с которым хоть работать, и приватно от класса, который хотим адаптировать под интерфейс. Во втором мы не наследуемся приватно, а агрегируем класс.

29. Имеется набор объектов, каждый из которых может обрабатывать запросы. Покажите, как с помощью паттерна Chain of Responsibility позволить программе отправлять запрос на обработку, не зная, какой конкретно объект этот запрос обработает.

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

class Handler{ public : virtual void HandleRequest() = NULL;};

class ConcreteHandler : public Handler{ private: int value; Handler *next; public: ConcreateHandler(int val, Handler * nex) bool HandleRequest(int val){ if (val == value) return true; else if (next!=NULL) return next->HandleRequest();}}; else cout << “Final”; return true;

int main(){ Handler* hand = new Concreatehandler(5, NULL); ;

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