Шаблоны проектирования Design Pattern Команда или действие (Command, Аction) по книге Эрик и Элизабет Фримен Паттерны проектирования.

Презентация:



Advertisements
Похожие презентации
Объекто-ориентированное проектирование Паттерны проектирования. 28 февраля 2008 г. 4 курс Технологии программирования.
Advertisements

©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Шаблоны проектирования Design Pattern Наблюдатель (Observer) или Слушатель (Listener) по книге Эрик и Элизабет Фримен Паттерны проектирования.
Шаблоны проектирования Design Pattern Декоратор, оформитель (Decorator) по книге Эрик и Элизабет Фримен Паттерны проектирования.
Исполнение программы Энциклопедия учителя информатики Газета «Первое сентября»
Шаблоны проектирования Design Pattern Фабрика (Factory) по книге Эрик и Элизабет Фримен Паттерны проектирования.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Что такое паттерны (шаблоны) проектирования? Эффективные способы решения характерных задач проектирования Обобщенное описание решения задачи, которое.
1 © Luxoft Training 2012 Введение в ООП Модуль #2.
OOП Инна Исаева. Подпрограмма – это большая программа, разделённая на меньшие части. В программе одна из подпрограмм является главной. Её задача состоит.
Презентация. Система управления базами данных (СУБД) совокупность программных и лингвистических средств общего или специального назначения, обеспечивающих.
Паттерн Command Тихонова Мария гр. 245 МатМех СПбГУ.
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
1 Диаграммы реализации (implementation diagrams).
Организация программного кода при создании информационных систем Подготовил: Студент группы МЭК-21 Акименко В. И. Руководитель: Доц. Яровенко А. Н.
Алгоритмический подход – главное алгоритм решения задачи ( в основном, используется для вычислительных задач ); Структурное программирование – декомпозиция,
Лекция 2. Модель клиент- сервер. УЧЕБНЫЕ ВОПРСЫ 1.Клиенты и серверы 2.Разделение приложений по уровням 3.Варианты архитектуры клиент-сервер.
Задача в контексте FinLab.PairTrade – это отдельный синтетический финансовый инструмент. -Простая задача -Уровневая задача -Суперзадача -Пользовательская.
САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
Транксрипт:

Шаблоны проектирования Design Pattern Команда или действие (Command, Аction) по книге Эрик и Элизабет Фримен Паттерны проектирования

2 Инкапсуляция вызовов методов Вызывающему объекту не нужно беспокоиться о том, как будут выполняться его запросы. Он просто использует инкапсулированный метод для решения своей задачи. Инкапсуляция позволяет решать и такие нетривиальные задачи, как регистрация или отмена вызовов.

3 Автоматизация дома Требуется разработать API для Пульта Домашней Автоматизации. Пульт имеет семь программируемых ячеек (каждая из которых связывается с отдельным домашним устройством) и соответствующую кнопку «вкл/выкл» для каждой ячейки. Кроме того, устройство оснащено кнопкой глобальной отмены. Также прилагается диск с набором классов Java, созданных разными фирмами-разработчиками для управления всевозможными домашними устройствами: светильниками, вентиляторами, ваннами-джакузи, акустическим оборудованием и т. д. Задача создать API для программирования пульта, чтобы каждая ячейка могла быть настроена на управление устройством или группой устройств. Также следует учесть, что пульт должен поддерживать как текущий набор устройств, так и все устройства, которые могут быть добавлены в будущем. onoff undo

4 CeilingFan high() medium() low() off() hetSpeed() Классы управления устройствами FaucetControl openValue() closeValue() TV on() off() setInputChannel() setVolume() CeilingLight on() off() dim() OutdoorLight on() off() GardenLight setDuskTime() setDownTime() manualOn() manualOff() SecurityControl arm() disarm() Light on() off() Sprinkler waterOn() waterOff() ApplianceControl on() off() GarageDoor up() down() stop() lightOn() lightOff() Termostat setTemperature() Hottub circulate() jetsOn() jetsOff() setTemperature() Stereo on() off() setCd() setDvd() setRadio() setVolume() … и будут еще

5 Обсуждение Сам пульт устроен просто: всего две кнопки включение/выключение на каждое устройство, но классы устройств очень разные… кроме оn() и off(), классы содержат много других методов: dim(), setTemperature(), setVolume(), setDirection()... в будущем появятся новые классы устройств с еще более разнообразными методами Архитектуру необходимо рассматривать с точки зрения разделения обязанностей: пульт должен обрабатывать нажатия кнопок и выдавать запросы. Он не должен обладать информацией об устройствах Пульт в любом случае не должен привязываться к конкретной реализации классов устройств. Программа не должна состоять из цепочки условных команд вида «if slot1 == Light, then light.on(), else if slot1 = Hottub then hottub.jetsOn()» Это признак плохой архитектуры

6 Паттерн «Команда» Паттерн Команда отделяет сторону, выдающую запрос, от объекта, фактически выполняющего операцию. В нашем примере запрос поступает от пульта, а объектом, выполняющим операцию, будет экземпляр одного из классов устройств. В архитектуру приложения вводятся «объекты команд». Объект команды инкапсулирует запрос на выполнение некой операции (скажем, включение света) с конкретным объектом (допустим, с осветительной системой). Если для каждой кнопки в приложении хранится свой объект команды, при ее нажатии мы обращаемся к объекту команды с запросом на выполнение операции. Сам пульт понятия не имеет, что это за операция, он знает только, как взаимодействовать с нужным объектом для выполнения операции. Получается, что пульт полностью отделен от объекта осветительной системы!

7 Взаимодействие объектов, на примере кафе Официантка получает заказ, кладет его на стойку и говорит «У нас заказ!» Посетитель передает официантке свой заказ повар готовит блюда, входящие в заказ Бланк заказа Наименованиевыходцена

8 более подробно посетитель просматривает меню и зоздает заказ результат повар выполняет инструкции, содержащиеся в заказе мне мороженко с фруктами Бланк заказа Наименованиевыходцена мороженко с фруктами createOrder() бланк инкапсулирует запрос на приготовление блюд takeOrder() задача официантки – получить заказ и вызвать метод orderUp() orderUp() для передачи распоряжений повару используются вызовы методов вида makeIcecream() makeIceCream() makeFrut()

9 От кафе к паттерну Команда execute() create Command Object() setCommand() action1() action2() … execute() Клиент отвечает за создание объекта команды, содержащего набор операций с получателем Команда содержит единственный метод execute(), в которм инкапсулированы операции с получателем Клиент вызывает метод setCommant() Инициатора, передавая ему объект команды. Инициатор хранит его до момента использования активизируются операции с получателем setCommand() createCommandObject() execute() action1() action2() инициатор вызывает метод execute() запрос на выполнение комвнды

10 Light on() off() Реализация команды включения света Использование объекта команды Простой тест Action.Device.Light Action.Command.Command Action.Command.LightOnCommand Action. RemoteControl.SimpleRemoteControl Action.Test.SimpleRemoteControlTest GarageDoor up() down() stop() lightOn() lightOff()

11 Определение паттерна Команда (Action, Command) Паттерн Команда инкапсулирует запрос в виде объекта, делая возможной параметризацию клиентских объектов с другими запросами, организацию очереди или регистрацию зайросов, а также поддержку отмены операций. ClientInvoker on() off() > Command execute() undo() Reciver action() ConcreteCommand execute() undo() public void execute(){ reciver.action() }

12 Связывание команд с ячейками execute() onoff undo lifing room light kitchen light lifing room ceiling fan garage door stereo all light party mode execute()

13 Реализация Action. RemoteControl.RemoteControl Action.Test.RemoteControlTest Action.Command. LightOffCommand GarageDoorDownCommand StereoWithCDCommand Объект NoCommand является примером пустого ( null ) объекта. Пустые объекты применяются тогда, когда вернуть «полноценный» объект невозможно, но вам хочется избавить клиента от необходимости проверять null -ссылки. Пустые объекты используются во многих паттернах проектирования, а некоторые авторы даже считают их самостоятельным паттерном. public void onButtonWasPushed(int slot){ if(onCommands[slot]!= null){ onCommands[slot].execute(); } как избавится от лишних проверок?

14 Архитектура API пульта > Command execute() Light on() off() LightOnCommand execute() LightOffCommand execute() RemoteControl onCommands offCommands setCommand() onButtonWasPressed() offButtonWasPressed() RemoteControlTest создает объекты команд, связываемые с ячейками управляет набором объектов-команд (по одному на кнопку) все команды реализуют интерфейс public void execute(){ light.on() } public void execute(){ light.off() } команды инкапсулируют набор операций с классом устройства пульт активизирует эти операции методом execute() классы устройств выполняют работу по управлению электроникой при нажатии на кнопку пульта вызывается метод execute() соответствующего объекта команды объект команды хранит ссылку на объект класса устройства, и в своем методе execute() вызывает один или несколько методов объекта устройства

15 Кнопка отмены 1. interface Command + метод undo() 2. в классах команд реализовать этот метод 3. включить в класс пульта RemoteControl механизм отслеживания последней нажатой кнопки и нажатия кнопки отмены DesignPatterns06undo: Light – простая отмена CeilingFan – отмена с состоянием GarageDoor

16 Макросы Нажатием одной кнопки выключить свет, включить телевизор и стереосистему, запустить DVD и наполнить джакузи.

17 Расширенные возможности очереди запросов регистрация запросов

18 Резюме Концепции ООП Абстракция Инкапсуляция Полиморфизм Наследование Стратегия определяет семейство алгоритмов, инкапсулирует каждый из них и обеспечивает их взаимозаменяемость. Он позволяет модифицировать алгоритмы независимо от их использования на стороне клиента. Наблюдатель определяет отношение «один- ко-многим» таким образом, что при изменений состояния одного объекта происходит автоматическое оповещение и обновление всех зависимых объектов. Декоратор динамически наделяет объект новыми возможностями и является гибкой альтернативой субклассированию в области расширения функциональности. Фабричный метод определяет интерфейс создания объекта, но позволяет субклассам выбрать создаваемый экземпляр. Абстрактная фабрика предоставляет интерфейс для создания семейств взаимосвязанных объектов без указания их конкретных классов. Одиночка гарантирует, что класс имеет только один экземпляр, и предоставляет точку доступа к этому экземпляру Принципы Инкапсулируйте, то что изменяется Отдавайте предпочтение композиции перед наследованием Программируйте на уровне интерфейсов, а не реализации Стремитесь к слабой связности взаимодействующих объектов Классы должны быть открыты для расширения, но закрыты для изменения Код должен зависеть от абстракций, а не от конкретных классов. Команда инкапсулирует запрос в виде объекта, делая возможной параметризацию клиентских объектов с другими запросами, организацию очереди или регистрацию запросов, поддержку отмены операций

19 Ключевые моменты Паттерн Команда отделяет объект, выдающий запросы, от объекта, который умеет эти запросы выполнять. Объект команды инкапсулирует получателя с операцией (или набором операций). Инициатор вызывает метод execute() объекта команды, что приводит к выполнению соответствующих операций с получателем. Возможна параметризация инициаторов командами (даже динамическая во время выполнения). Команды могут поддерживать механизм отмены, восстанавливающий объект в состоянии до последнего вызова метода execute(). Макрокоманды простое расширение паттерна Команда, позволяющее выполнять цепочки из нескольких команд. В них также легко реализуется механизм отмены. На практике нередко встречаются «умные» объекты команд, которые реализуют запрос самостоятельно вместо его делегирования получателю. Команды также могут использоваться для реализации систем регистрации команд и поддержки транзакций.