Download - Konstantin slisenko - Design patterns
![Page 1: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/1.jpg)
Шаблоны проектирования
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 2: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/2.jpg)
План
1. Что такое шаблон проектирования?2. История появления3. Преимущества и критика4. Классификация шаблонов проектирования5. Примеры некоторых шаблонов6. Моделирование системы управления
движением транспорта на перекрёстке с применением шаблонов проектирования
7. Выводы© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 3: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/3.jpg)
Что такое шаблон проектирования?
• В процессе написания программ (как и в любой другой области) часто возникают похожие задачи
• Мы люди умные, и не хотим каждый раз “изобретать велосипед”
• Мы можем выработать готовые решения для этих похожих задач и использовать их при необходимости
• Такие решения называются шаблонами проектирования
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 4: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/4.jpg)
Что такое шаблон проектирования?
• Шаблон проектирования (англ. design pattern) – многократно используемое решение распространённых задач при разработке программного обеспечения
• По своей сути шаблоны – абстрактные решения для абстрактных ситуаций
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 5: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/5.jpg)
История появленияШаблоны проектирования впервые появились в строительной архитектуре.
Человечество на сегодняшний день:
5000 лет опыта в строительствеМенее 40 лет опыта в разработке и проектировании ПО
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 6: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/6.jpg)
История появленияКристофер Александер – архитектор и филосов. Две книги:
– “A Pattern Labguage: Towns, Buildings, Constructions” (Oxford University Press, 1977)
– “The Timeless Way of Building” (Oxford University Press, 1979)
Идеи нашли применение в других областях, в том числе и в разработке ПО
Эрик Гамма, Ричард Хелм, Джон Влиссидес, Ральф Джонсон – “Design patterns” или “Gang of Four” (GoF – банда четырёх), середина 1990-х
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 7: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/7.jpg)
Преимущества• Стандартный шаблон можно хорошо проработать
– В программах, где он используется, будет меньше кода, потенциально содержащего ошибки
• Упрощается коммуникации между программистами– Если два программиста говорят об одной и той же ситуации, но разными
словами – они могут друг друга не понять. Когда они говорят о стандартном шаблоне – обоим понятно, о чём идёт речь.
• Легче разобраться в новой системе – в ней есть знакомые части
• Всё придумано до нас– Существует множество готовых и проверенных временем стандартных
шаблонов. Мы можем использовать их в своих программах.
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 8: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/8.jpg)
Критика
• Зацикливание на шаблонах порождает привычку пользоваться стандартными вещами и отучает нас придумывать нестандартные решения
• Шаблоны часто применяют слепо, поэтому использование оборачивается только ограничениями:– “У нас есть задача - этот шаблон лучше всего её решает -
выбираем его“ – правильно– “Я знаю клёвый шаблон - давайте подгоним под него
задачу” – не правильно© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 9: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/9.jpg)
Классификация шаблонов
1. Основные 2. Порождающие3. Структурные4. Поведенческие5. Разделяющие6. Архитектурные7. Анти-паттерны
И другие© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 10: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/10.jpg)
Классификация шаблонов
• Основные – Фундаментальные, используются другими шаблонами
– Delegation, interface, abstract superclass, interface and abstract class, immutable, marker-interface, proxy
• Порождающие– Делают систему независимой от процесса создания
объектов
– Factory method, abstract factory, builder, prototype, singleton, object pool
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 11: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/11.jpg)
Классификация шаблонов
• Структурные– Описывают, как их классов и объектов собираются более крупные
структуры
– Adapter, iterator, bridge, facade, flyweight, dynamic linkage, virtual proxy, decorator, cache management
• Поведенческие– Определяют взаимодействие между компонентами. Увеличивают
его гибкость
– Chain of responsibility, command, little language, mediator, snapshot, observer, state, null object, strategy, template method, visitor
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 12: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/12.jpg)
Классификация шаблонов• Разделяющие
– Описывают, как их классов и объектов собираются более крупные структуры
– Filter, composite, read only interface
• Архитектурные– Определяют взаимодействие между компонентами. Увеличивают его
гибкость
– Modev-view-controller, layer, client-server…
• Анти-паттерны– Как не следует поступать при разработке программ
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 13: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/13.jpg)
Singleton (одиночка)
• Гарантирует, что у класса есть только один экземпляр и предоставляет к нему глобальную точку доступа
• Сам класс запрещает создание дополнительных экземпляров
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 14: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/14.jpg)
Singleton (одиночка)
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
public class Singleton { private static Singleton instanse; private String message = "Hello, I'm Singleton!";
private Singleton() { }
public static synchronized Singleton getInstanse() { if (instanse == null) { instanse = new Singleton(); } return instanse; }
public void say() { System.out.println(message); }}
![Page 15: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/15.jpg)
Singleton (одиночка)• Цели использования
– Централизованное управление ресурсом– Доступ из любой точки программы– Создание объекта требует больших ресурсов памяти или
процессора
• Примеры из жизни– Текущий проигрываемый аудиоклип в плеере– Текущий пользователь в системе– Класс для локализации– Spring application context (требует много ресурсов)– Hibernate session factory (при создании считывает
конфигурационные файлы)© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 16: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/16.jpg)
Builder (Строитель)
• Делает процесс создания сложного объекта независимым от того, как конструируются сами части и как они взаимодействуют между собой
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
• Состоит из нескольких ролей:– Builder - определяет, как
создаются части– Director - определяет, как
собирается объект из этих частей
– Product – то, что получается в результате построения
![Page 17: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/17.jpg)
Builder (Строитель)class Pizza { private String dough = ""; private String sauce = ""; private String topping = ""; public void setDough(String dough) { this.dough = dough; }
public void setSauce(String sauce) { this.sauce = sauce; }
public void setTopping(String topping) { this.topping = topping; } }
abstract class PizzaBuilder { protected Pizza pizza;
public Pizza getPizza() { return pizza; }
public void createNewPizzaProduct() { pizza = new Pizza(); }
public abstract void buildDough(); public abstract void buildSauce(); public abstract void buildTopping(); }
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 18: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/18.jpg)
Builder (Строитель)class HawaiianPizzaBuilder extends PizzaBuilder { public void buildDough() { pizza.setDough("cross"); } public void buildSauce() { pizza.setSauce("mild"); } public void buildTopping() { pizza.setTopping("ham+pineapple"); } }
class SpicyPizzaBuilder extends PizzaBuilder { public void buildDough() { pizza.setDough("pan baked"); } public void buildSauce() { pizza.setSauce("hot"); } public void buildTopping() { pizza.setTopping("pepperoni+salami"); } }
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 19: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/19.jpg)
Builder (Строитель)class Cook { private PizzaBuilder pizzaBuilder; public void setPizzaBuilder(PizzaBuilder pb) { pizzaBuilder = pb; } public Pizza getPizza() { return pizzaBuilder.getPizza(); } public void constructPizza() { pizzaBuilder.createNewPizzaProduct(); pizzaBuilder.buildDough(); pizzaBuilder.buildSauce(); pizzaBuilder.buildTopping(); } }
public class BuilderExample { public static void main(String[] args) { Cook cook = new Cook(); PizzaBuilder hawaiianPizzaBuilder = new HawaiianPizzaBuilder(); PizzaBuilder spicyPizzaBuilder = new SpicyPizzaBuilder();
cook.setPizzaBuilder(hawaiianPizzaBuilder); cook.constructPizza(); Pizza hawaiian = cook.getPizza();
cook.setPizzaBuilder(spicyPizzaBuilder); cook.constructPizza(); Pizza spicy = cook.getPizza(); }}
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 20: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/20.jpg)
Builder (Строитель)
• Пример – выборка товара из каталога по сложным критериям
• При выборе очередного критерия могут открываться новые контролы– Builder: различный для каждого типа товаров:
фотоаппараты, телефоны, плееры– Director: форма выбора товара – Product: объект с критериями
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 21: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/21.jpg)
Abstract Factory (Абстрактная фабрика)
• Интерфейс для создания группы объектов, принадлежащих одному набору классов и используемых совместно
• Конкретные классы созданных объектов неизвестны
• Система не зависит от того, как создаются объекты
• Логика создания объектов спрятана в фабрике
• Абстрактная фабрика переопределяется в конкретных классах-фабриках
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 22: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/22.jpg)
Abstract Factory (Абстрактная фабрика)
Пример – различные стили пользовательского интерфейса• Мы хотим, чтобы в программе можно было поменять
тему оформления• Описываем интерфейс для фабрики, которая создаёт
компоненты пользовательского интерфейса: кнопки, текстовые поля, списки, и т.д.
• Для каждой темы делаем свою реализацию фабрики• В любой момент подменяем одну фабрику на другую и
внешний вид пользовательского интерфейса меняется
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 23: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/23.jpg)
Abstract Factory (Абстрактная фабрика)
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 24: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/24.jpg)
Abstract Factory (Абстрактная фабрика)interface GUIFactory { public Button createButton(); }
class WinFactory implements GUIFactory { public Button createButton() { return new WinButton(); } }
class LinuxFactory implements GUIFactory { public Button createButton() { return new LinuxButton(); } }
interface Button { public void paint(); }
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 25: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/25.jpg)
Abstract Factory (Абстрактная фабрика)class WinButton implements Button { public void paint() { System.out.println("I'm a WinButton"); } }
class LinuxButton implements Button { public void paint() { System.out.println("I'm an LinuxButton"); } }
class Application { public Application(GUIFactory factory) { Button button = factory.createButton(); button.paint(); } }
public class Main{ public static void main(String[] args) { new Application(new LinuxFactory()); } }
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 26: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/26.jpg)
Observer (Наблюдатель)
• Второе название – “издатель-подписчик”
• Один объект генерирует события, другие объекты эти события получает и на них реагируют
• Первый объект – наблюдаемый (издатель), остальные – наблюдатели (подписчики)
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 27: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/27.jpg)
Observer (Наблюдатель)
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
import java.util.Observable;import java.util.Observer;
public class MyObservable extends Observable { public void doSomething() { setChanged(); notifyObservers(); }}
public class MyObserver implements Observer { public void update (Observable obj, Object arg) { System.out.println(“updated”); } }
public class MyApp { public static void main(String args[]) { MyObservable a = new MyObservable(); MyObserver b = new MyObserver(); a.addObserver(b); a.doSomething();}
![Page 28: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/28.jpg)
Observer (Наблюдатель)
• Пример – диаграмма в Excell, построенная по таблице
• При изменении данных в таблице – меняется диаграмма
• Объект “диаграмма” является подписчиком всех объектов “ячейка”
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 29: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/29.jpg)
Strategy (Стратегия)
• Общий интерфейс для абстрактного алгоритма
• Разные реализации конкретных алгоритмов - стратегий
• Если нужно поменять алгоритм – подменяем одну стратегию другой
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 30: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/30.jpg)
Strategy (Стратегия)class StrategyExample { public static void main(String[] args) { IStragtegy myStrategy; myStrategy = new AddStrategy(); int resultA = myStrategy.count (3,4); myStrategy = new MultStrategy(); int resultB = myStrategy .count(3,4); } }
interface Strategy { int count(int a, int b);}
class AddStrategy implements IStrategy { public int count(int a, int b) { return a + b; } }
class MultStrategy implements IStrategy { public int count(int a, int b) { return a * b; } }
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 31: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/31.jpg)
Strategy (Стратегия)
• Пример 1 – фильтры в Photoshop, на вход подаётся изображение, к нему применяется стратегия-фильтр
• Пример 2 – поведение ботов в играх
• Пример 3 – Forex, каждый участник может реализовать свой алгоритм, который будет вести торги
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 32: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/32.jpg)
Facade (Фасад)• Единая обёртка для группы классов• Мы пользуемся фасадом и не думаем о
классах, которые лежат за ним• Уменьшается связанность между частями
системы
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 33: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/33.jpg)
Facade (Фасад)• Пример – любые библиотеки и модули, у
которых описан интерфейс
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 34: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/34.jpg)
Facade (Фасад)public class MessageHeader { private String from; private String to; public String getFrom() { return from; } public void setFrom(String from) { this.from = from; } public String getTo() { return to; } public void setTo(String to) { this.to = to; }}
public class MessageBody { private String text; public String getText() { return text; } public void setText(String text) { this.text = text; }}
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 35: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/35.jpg)
Facade (Фасад)public class Message { private MessageBody body; private MessageHeader header;
public MessageBody getBody() { return body; }
public void setBody(MessageBody body) { this.body = body; }
public MessageHeader getHeader() { return header; }
public void setHeader(MessageHeader header) { this.header = header; }}
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 36: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/36.jpg)
Facade (Фасад)public class MessageCreatorFacade { private Message message = new Message(); private MessageHeader mh = new MessageHeader(); private MessageBody mb = new MessageBody();
public void setFrom(String from) { mh.setFrom(from); }
public void setTo(String to) { mh.setTo(to); }
public void setText(String text) { mb.setText(text); }
public Message createMessage() { message.setBody(mb); message.setHeader(mh); return message; }}
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 37: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/37.jpg)
Моделируем систему управления движением на перекрёстке
• Первый этап: GUI-интерфейс– вместо светофоров – картинки– вместо датчиков – кнопки
• Представление и логика должны быть разделены
• Кнопки и картинки должны замениться драйверами реальных устройств
• Переключение светофоров задаётся таблицей
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 38: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/38.jpg)
Таблица переключений
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
1 2 3 4 5 6 7 8 9 10 11 12 13 141 x x x x x x 2 x x x x x x 3 x x x x4 x x x x x x x x5 x x x x x x x x6 x x x x7 x x x x x x x x8 x x x x x x 9 x x
10 x x x x x x 11 x x x x x x x x12 x x 13 x x x x x x 14 x x x x x x
![Page 39: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/39.jpg)
Требования к системе
• Система должна иметь возможность конфигурирования под любой перекрёсток
• Система должна поддерживать различные режимы работы: – обычное переключение– ночной режим (датчик фиксирует приближение
автомобиля ему включается зелёный свет)• К системе должны подключаться любые модели и
типы светофоров• В любой момент пересечение перекрёстка должно
быть безопасным© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 40: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/40.jpg)
Мой вариант class Class Model
RegularStrategy
«interface»ITrafficLight
«interface»ISensor
GUIAutoTrafficLight GUIPedestrianTrafficLight
ControlSystem
TrafficLight
AutoTrafficLight
RealTrafficLight
TrafficLight
PedestrianTrafficLight
RealPedestrianLightSensor
RealAutoSensor
Sensor
RealPedestrianSensor
«interface»IStrategy
NightStrategy
«interface»Observ able
Observ er
AutoSensor PedestrianSensor
1
1
class Class Model
«interface»ITLCSFactory
GuiTLCSFactory RealTLCSFactory
class Class Model
GUIConfirurationBuilder
«interface»IGuiObject
Direction
Way
Crossing
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 41: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/41.jpg)
Выводы
• Использование паттернов избавляет от необходимости постоянно придумывать новые решения– В этом как положительный, так и отрицательный момент
• Использование паттернов делает код менее подверженным ошибкам
• Знание паттернов упрощает коммуникации между разработчиками
• Зная паттерны - мы имеем множество готовых решений наших задач
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
![Page 42: Konstantin slisenko - Design patterns](https://reader030.vdocuments.net/reader030/viewer/2022020105/55657e6fd8b42a723f8b4a12/html5/thumbnails/42.jpg)
Спасибо за внимание
Презентацию можно будет найти на сайте, когда он откроется
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam