Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
UML-диаграмма классов паттерна Command⇐ ПредыдущаяСтр 12 из 12
Тип: поведенческий Назначение: для обработки команды в виде объекта Родственные шаблоны: Компоновщик, Хранитель, Прототип, Одиночка Реализация паттерна Command Рассмотрим реализацию паттерна Command на примере игры «Шахматы». Имитируем возможность выполнения следующих операций: · Создать новую игру. · Открыть существующую игру. · Сохранить игру. · Сделать очередной ход. · Отменить последний ход.
Вывод программы:
Результаты применения паттерна Command Достоинства паттерна Command · Придает системе гибкость, отделяя инициатора запроса от его получателя.
Пример: #include <iostream> #include <vector> #include <string> using namespace std; Class Document { vector<string> data; public: void Insert(int line, const string & str) { if (line <= data.size()) data.insert(data.begin() + line, str); else cout << "Error!" << endl; } void Remove(int line) { if(!(line>data.size())) data.erase(data.begin() + line); else cout << "Error!" << endl; } string & operator [] (int x) { return data[x]; } void Show() { for(int i = 0; i<data.size(); ++i) { cout << i + 1 << ". " << data[i] << endl; } } }; Class Command { protected: Document * doc; public: virtual void Execute() = 0; virtual void unExecute() = 0; void setDocument(Document * _doc) { doc = _doc; } }; Class InsertCommand: public Command { int line; string str; public: InsertCommand(int _line, const string & _str): line(_line), str(_str) {} void Execute() { doc->Insert(line, str); } void unExecute() { doc->Remove(line); } }; Class Receiver { vector<Command*> DoneCommands; Document doc; Command* command; public: void Insert(int line, string str) { command = new InsertCommand(line, str); command->setDocument(&doc); command->Execute(); DoneCommands.push_back(command); } void Undo() { if(DoneCommands.size() == 0) { cout << "There is nothing to undo!" << endl; } else { command = DoneCommands.back(); DoneCommands.pop_back(); command->unExecute(); // Don't forget to delete command!!! delete command; } } void Show() { doc.Show(); } }; Int main() { char s = '1'; int line, line_b; string str; Receiver res; while(s!= 'e') { cout << "What to do: \n1.Add a line\n2.Undo last command" << endl; cin >> s; switch(s) { case '1': cout << "What line to insert: "; cin >> line; --line; cout << "What to insert: "; cin >> str; res.Insert(line, str); break; case '2': res.Undo(); break; } cout << "$$$DOCUMENT$$$" << endl; res.Show(); cout << "$$$DOCUMENT$$$" << endl; } } Задания для лабораторной работы В каждом из вариантов указан шаблон для реализации и проект, использующий этот шаблон. Необходимо сделать следующее: 1. Нарисовать в UML диаграмму классов реализуемой программы. (проектирование) 2. Реализовать программу на С++. (реализация)
Для каждого из шаблонов, предложенных в вариантах можно найти пример реализации UML и кода в приложенной книге “Паттерны проектирования”.
Вариант №1, 9, 17, 25 Шаблон “Стратегия”. Проект “Принтеры”. В проекте должны быть реализованы разные модели принтеров, которые выполняют разные виды печати. Пример использования шаблона в главе 1.
Вариант №2, 10, 18, 26 Шаблон “Наблюдатель”. Проект “Оповещение постов ГАИ”. В проекте должна быть реализована отправка сообщений всем постам ГАИ. Пример использования шаблона в главе 2. Вариант №3, 11, 19, 27 Шаблон “Декоратор”. Проект “Универсальная электронная карта”. В проекте должна быть реализована универсальная электронная карта, в которой есть функции паспорта, страхового полиса, банковской карты и т. д. Пример использования шаблона в главе 3. Вариант №4, 12, 20, 28 Шаблон “Фабричный метод”. Проект “Фабрика смартфонов”. В проекте должно быть реализовано создание смартфонов с различными характеристиками. Пример использования шаблона в главе 4. Вариант №5, 13, 21, 29 Шаблон “Абстрактная фабрика”. Проект “Заводы по производству автомобилей”. В проекте должно быть реализована возможность создавать автомобили различных типов на разных заводах. Вариант №6, 14, 22, 30 Шаблон “Команда”. Проект “Клавиатура настраимаемого калькулятора”. Цифровые и арифметические кнопки имеют фиксированную функцию, а остальные могут менять своё назначение. Вариант №7, 15, 23 Шаблон “Адаптер”. Проект “Часы”. В проекте должен быть реализован адаптер, который дает возможность пользоваться часами со стрелками так же, как и цифровыми часами. В классе “Часы со стрелками” хранятся повороты стрелок. Пример использования шаблона в главе 7. Вариант №8, 16, 24 Шаблон “Фасад”. Проект “Компьютер”. В проекте должен быть реализован “компьютер”, который выполняет основные функции, к примеру, включение, выключение, запуск ОС, запуск программы, и т.д, не раскрывая клиенту деталей выполнения этой операции. Пример использования шаблона в главе 7.
Литература, ссылки 1. https://ru.wikipedia.org/wiki/%D8%E0%E1%EB%EE%ED_%EF%F0%EE%E5%EA%F2%E8%F0% EE%E2%E0%ED%E8%FF 2. http://citforum.ru/SE/project/pattern/ 3. Э.Фримен, К.Сьерра, Б.Бейтс Паттерны проектирования. СПб.: Питер, 2011. 4. Классическая книга “банды четырех”. Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес. Приемы объектно-ориентированного проектирования. Паттерны проектирования. (разные издания, последнее 2015).
|
||||||||
Последнее изменение этой страницы: 2021-11-27; просмотров: 345; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.160.216 (0.03 с.) |