SlideShare ist ein Scribd-Unternehmen logo
1 von 42
Шаблоны проектирования © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
План Что такое шаблон проектирования? История появления Преимущества и критика Классификация шаблонов проектирования Примеры некоторых шаблонов Моделирование системы управления движением транспорта на перекрёстке с применением шаблонов проектирования Выводы © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Что такое шаблон проектирования? В процессе написания программ (как и в любой другой области) часто возникают похожие задачи Мы люди умные, и не хотим каждый раз “изобретать велосипед”  Мы можем выработать готовые решения для этих похожих задач и использовать их при необходимости Такие решения называются шаблонами проектирования © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Что такое шаблон проектирования? Шаблон проектирования (англ. design pattern) – многократно используемое решение распространённых задач при разработке программного обеспечения По своей сути шаблоны – абстрактные решения для абстрактных ситуаций © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
История появления Шаблоны проектирования впервые появились в строительной архитектуре. Человечество на сегодняшний день: 5000 лет опыта в строительстве Менее 40 лет опыта в разработке и проектировании ПО © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
История появления Кристофер Александер – архитектор и филосов. Две книги:  “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
Преимущества Стандартный шаблон можно хорошо проработать  В программах, где он используется, будет меньше кода, потенциально содержащего ошибки Упрощается коммуникации между программистами Если два программиста говорят об одной и той же ситуации, но разными словами – они могут друг друга не понять. Когда они говорят о стандартном шаблоне – обоим понятно, о чём идёт речь. Легче разобраться в новой системе – в  ней есть знакомые части Всё придумано до нас Существует множество готовых и проверенных временем стандартных шаблонов. Мы можем использовать их в своих программах. © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Критика Зацикливание на шаблонах порождает привычку пользоваться стандартными вещами и отучает нас придумывать нестандартные решения Шаблоны часто применяют слепо, поэтому использование оборачивается только ограничениями: “У нас есть задача - этот шаблон лучше всего её решает - выбираем его“ – правильно “Я знаю клёвый шаблон - давайте подгоним под него задачу” – не правильно © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Классификация шаблонов Основные  Порождающие Структурные Поведенческие Разделяющие Архитектурные Анти-паттерны И другие © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Классификация шаблонов Основные  Фундаментальные, используются другими шаблонами 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
Классификация шаблонов Структурные Описывают, как их классов и объектов собираются более крупные структуры 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
Классификация шаблонов Разделяющие Описывают, как их классов и объектов собираются более крупные структуры Filter, composite, read only interface Архитектурные Определяют взаимодействие между компонентами. Увеличивают его гибкость Modev-view-controller, layer, client-server… Анти-паттерны Как не следует поступать при разработке программ © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Singleton (одиночка) Гарантирует, что у класса есть только один экземпляр и предоставляет к нему глобальную точку доступа Сам класс запрещает создание дополнительных экземпляров © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Singleton (одиночка) publicclass Singleton { privatestatic Singleton instanse; private String message = "Hello, I'm Singleton!"; private Singleton() {    } publicstaticsynchronized Singleton getInstanse() { if (instanse == null) { instanse = new Singleton();      } returninstanse;    } publicvoid say() { System.out.println(message);    } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Singleton (одиночка) Цели использования Централизованное управление ресурсом Доступ из любой точки программы Создание объекта требует больших ресурсов памяти или процессора Примеры из жизни Текущий проигрываемый аудиоклип в плеере Текущий пользователь в системе Класс для локализации Spring applicationcontext (требует много ресурсов) Hibernate session factory (при создании считывает конфигурационные файлы) © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Builder (Строитель) Делает процесс создания сложного объекта независимым от того, как конструируются сами части и как они взаимодействуют между собой Состоит из нескольких ролей: Builder - определяет, как создаются части Director -определяет, как собирается объект из этих частей Product – то, что получается в результате построения © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Builder (Строитель) classPizza {  privateString dough = "";  privateString sauce = "";  privateString topping = "";  publicvoidsetDough(String dough) {  this.dough= dough;  }  publicvoidsetSauce(String sauce) {  this.sauce= sauce;  }  publicvoidsetTopping(String topping) {  this.topping= topping;  }  }  abstractclassPizzaBuilder {  protectedPizza pizza;  publicPizza getPizza() {  returnpizza;  }  publicvoidcreateNewPizzaProduct() {  pizza = new Pizza();  }  publicabstractvoidbuildDough();  publicabstractvoidbuildSauce();  publicabstractvoidbuildTopping();  }  © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Builder (Строитель) classHawaiianPizzaBuilderextendsPizzaBuilder {  publicvoidbuildDough() { pizza.setDough("cross");  }  publicvoidbuildSauce() {  pizza.setSauce("mild");  }  publicvoidbuildTopping(){ pizza.setTopping("ham+pineapple");  }  } classSpicyPizzaBuilderextendsPizzaBuilder {  publicvoidbuildDough() {  pizza.setDough("pan baked");  }  publicvoidbuildSauce() {  pizza.setSauce("hot");  }  publicvoidbuildTopping() {  pizza.setTopping("pepperoni+salami");  }  } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Builder (Строитель) classCook {  privatePizzaBuilderpizzaBuilder;  publicvoidsetPizzaBuilder(PizzaBuilderpb) {  pizzaBuilder= pb;  }  publicPizza getPizza() {  returnpizzaBuilder.getPizza();  }  publicvoidconstructPizza() {  pizzaBuilder.createNewPizzaProduct();  pizzaBuilder.buildDough();  pizzaBuilder.buildSauce();  pizzaBuilder.buildTopping();  }  }  publicclassBuilderExample {  publicstaticvoid main(String[] args) {  Cook cook = new Cook();  PizzaBuilderhawaiianPizzaBuilder = newHawaiianPizzaBuilder();  PizzaBuilderspicyPizzaBuilder = newSpicyPizzaBuilder();  cook.setPizzaBuilder(hawaiianPizzaBuilder);  cook.constructPizza();  Pizza hawaiian = cook.getPizza();  cook.setPizzaBuilder(spicyPizzaBuilder);  cook.constructPizza();  Pizza spicy = cook.getPizza();  } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Builder (Строитель) Пример– выборка товара из каталога по сложным критериям При выборе очередного критерия могут открываться новые контролы Builder: различный для каждого типа товаров: фотоаппараты, телефоны, плееры Director: форма выбора товара  Product: объект с критериями © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Abstract Factory (Абстрактная фабрика) Интерфейс для создания группы объектов, принадлежащих одному набору классов и используемых совместно Конкретные классы созданных объектов неизвестны Система не зависит от того, как создаются объекты Логика создания объектов спрятана в фабрике Абстрактная фабрика переопределяется в конкретных классах-фабриках © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Abstract Factory (Абстрактная фабрика) Пример –различные стили пользовательского интерфейса Мы хотим, чтобы в программе можно было поменять тему оформления Описываем интерфейс для фабрики, которая создаёт компоненты пользовательского интерфейса: кнопки, текстовые поля, списки, и т.д. Для каждой темы делаем свою реализацию фабрики В любой момент подменяем одну фабрику на другуюи внешний вид пользовательского интерфейса меняется © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Abstract Factory (Абстрактная фабрика) © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Abstract Factory (Абстрактная фабрика) interfaceGUIFactory {       publicButton createButton();  }  classWinFactoryimplementsGUIFactory {       publicButton createButton() {              returnnewWinButton();        }  }  classLinuxFactoryimplementsGUIFactory {        publicButton createButton() {              returnnewLinuxButton();        }  }  interface Button {       publicvoid paint();  }  © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Abstract Factory (Абстрактная фабрика) classWinButtonimplements Button {        publicvoid paint()  {  System.out.println("I'm a WinButton");        }  }  classLinuxButtonimplements Button {        publicvoid paint() {  System.out.println("I'm an LinuxButton");        }  } class Application {        public Application(GUIFactory factory) { 			             Button button = factory.createButton(); 		 button.paint();       }  }  publicclass Main{        publicstaticvoid main(String[] args) {              new Application(new LinuxFactory());        }  } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Observer (Наблюдатель) Второе название – “издатель-подписчик” Один объект генерирует события, другие объекты эти события получает и на них реагируют Первый объект – наблюдаемый (издатель), остальные – наблюдатели (подписчики) © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Observer (Наблюдатель) importjava.util.Observable; importjava.util.Observer; publicclassMyObservableextends Observable {        publicvoiddoSomething() { setChanged();  notifyObservers();        } } publicclassMyObserverimplementsObserver {        publicvoid update (Observable obj, Object arg) {  System.out.println(“updated”);        }  }  publicclassMyApp {        publicstaticvoid main(String args[])  { MyObservable a = newMyObservable();  MyObserver b = newMyObserver(); 	 a.addObserver(b); a.doSomething(); } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Observer (Наблюдатель) Пример – диаграмма в Excell, построенная по таблице При изменении данных в таблице – меняется диаграмма Объект “диаграмма” является подписчиком всех объектов “ячейка” © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Strategy (Стратегия) Общий интерфейс для абстрактного алгоритма Разные реализации конкретных алгоритмов - стратегий Если нужно поменять алгоритм – подменяем одну стратегию другой © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Strategy (Стратегия) classStrategyExample {       publicstaticvoid main(String[] args) {  IStragtegymyStrategy;  myStrategy = newAddStrategy();  intresultA = myStrategy.count (3,4);  myStrategy = newMultStrategy();  intresultB = myStrategy.count(3,4);        }  }  interface Strategy {  int count(int a, int b); }  classAddStrategyimplementsIStrategy {        publicint count(int a, int b) {              return a + b;       }  }  classMultStrategyimplementsIStrategy {        publicint count(int a, int b) {              return a * b;       }  }  © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Strategy (Стратегия) Пример 1 – фильтры в Photoshop, на вход подаётся изображение, к нему применяется стратегия-фильтр Пример 2 – поведение ботов в играх Пример 3 – Forex, каждый участник может реализовать свой алгоритм, который будет вести торги © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Facade (Фасад) Единая обёртка для группы классов Мы пользуемся фасадом и не думаем о классах, которые лежат за ним Уменьшается связанность между частями системы © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Facade (Фасад) Пример – любые библиотеки и модули, у которых описан интерфейс © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Facade (Фасад) publicclassMessageHeader { private String from; private String to; public String getFrom() { return from; } publicvoidsetFrom(String from) { this.from = from; } public String getTo() { return to; } publicvoidsetTo(String to) { this.to = to; } } publicclassMessageBody { private String text; public String getText() { return text; } publicvoidsetText(String text) { this.text = text; } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Facade (Фасад) publicclass Message { privateMessageBody body; privateMessageHeader header; publicMessageBodygetBody() { return body; } publicvoidsetBody(MessageBody body) { this.body = body; } publicMessageHeadergetHeader() { return header; } publicvoidsetHeader(MessageHeader header) { this.header = header;    } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Facade (Фасад) publicclassMessageCreatorFacade { private Message message = new Message(); privateMessageHeadermh = newMessageHeader(); privateMessageBodymb = newMessageBody(); publicvoidsetFrom(String from) { mh.setFrom(from); } publicvoidsetTo(String to) { mh.setTo(to); }    publicvoidsetText(String text) { mb.setText(text); } public Message createMessage() { message.setBody(mb); message.setHeader(mh); return message;    } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Моделируем систему управления движением на перекрёстке Первый этап:GUI-интерфейс вместо светофоров – картинки вместо датчиков – кнопки Представление и логика должны быть разделены Кнопки и картинки должны замениться драйверами реальных устройств Переключение светофоров задаётся таблицей © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Таблица переключений © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Требования к системе Система должна иметь возможность конфигурирования под любой перекрёсток Система должна поддерживать различные режимы работы:  обычное переключение ночной режим (датчик фиксирует приближение автомобиля ему включается зелёный свет) К системе должны подключаться любые модели и типы светофоров В любой момент пересечение перекрёстка должно быть безопасным © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Мой вариант © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Выводы Использование паттернов избавляет от необходимости постоянно придумывать новые решения В этом как положительный, так и отрицательный момент Использование паттернов делает код менее подверженным ошибкам Знание паттернов упрощает коммуникации между разработчиками Зная паттерны - мы имеем множество готовых решений наших задач © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
Спасибо за внимание Презентацию можно будет найти на сайте, когда он откроется  © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam

Weitere ähnliche Inhalte

Was ist angesagt?

CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest
 

Was ist angesagt? (7)

CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NET
 
Чистая архитектура, Артур Бадретдинов АБЦТ
Чистая архитектура, Артур Бадретдинов АБЦТЧистая архитектура, Артур Бадретдинов АБЦТ
Чистая архитектура, Артур Бадретдинов АБЦТ
 
Тестирирование с xUnit
Тестирирование с xUnitТестирирование с xUnit
Тестирирование с xUnit
 
Менеджер пакетов NuGet
Менеджер пакетов NuGetМенеджер пакетов NuGet
Менеджер пакетов NuGet
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real world
 
История развития и применения CMS: Drupal и другие
История развития и применения CMS: Drupal и другиеИстория развития и применения CMS: Drupal и другие
История развития и применения CMS: Drupal и другие
 

Andere mochten auch

Observer design pattern
Observer design patternObserver design pattern
Observer design pattern
Sara Torkey
 

Andere mochten auch (12)

Design pattern-presentation
Design pattern-presentationDesign pattern-presentation
Design pattern-presentation
 
L05 Design Patterns
L05 Design PatternsL05 Design Patterns
L05 Design Patterns
 
Observer Software Design Pattern
Observer Software Design Pattern Observer Software Design Pattern
Observer Software Design Pattern
 
Observer Pattern
Observer PatternObserver Pattern
Observer Pattern
 
Design patterns - Observer Pattern
Design patterns - Observer PatternDesign patterns - Observer Pattern
Design patterns - Observer Pattern
 
Design Pattern - Observer Pattern
Design Pattern - Observer PatternDesign Pattern - Observer Pattern
Design Pattern - Observer Pattern
 
Observer design pattern
Observer design patternObserver design pattern
Observer design pattern
 
Observer design pattern
Observer design patternObserver design pattern
Observer design pattern
 
Observer Pattern
Observer PatternObserver Pattern
Observer Pattern
 
Observer design pattern
Observer design patternObserver design pattern
Observer design pattern
 
Design pattern - Software Engineering
Design pattern - Software EngineeringDesign pattern - Software Engineering
Design pattern - Software Engineering
 
Observer and Decorator Pattern
Observer and Decorator PatternObserver and Decorator Pattern
Observer and Decorator Pattern
 

Ähnlich wie Konstantin slisenko - Design patterns

Konstantin slisenko - Spring Framework
Konstantin slisenko - Spring FrameworkKonstantin slisenko - Spring Framework
Konstantin slisenko - Spring Framework
beloslab
 
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0
beloslab
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. Введние
Sergey Nemchinsky
 
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in developement
Konstantin Slisenko -  OSGi, Equinox, Eclipse plug-in developementKonstantin Slisenko -  OSGi, Equinox, Eclipse plug-in developement
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in developement
beloslab
 
История проекта, который никогда не падает / Андрей Шетухин
История проекта, который никогда не падает / Андрей ШетухинИстория проекта, который никогда не падает / Андрей Шетухин
История проекта, который никогда не падает / Андрей Шетухин
Ontico
 
WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь...
 WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь... WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь...
WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь...
GeeksLab Odessa
 
Developmentmanage3.0
Developmentmanage3.0Developmentmanage3.0
Developmentmanage3.0
WRider
 
мартюшев почему юнит-тесты не работают. история большого проекта
мартюшев   почему юнит-тесты не работают. история большого проектамартюшев   почему юнит-тесты не работают. история большого проекта
мартюшев почему юнит-тесты не работают. история большого проекта
Magneta AI
 
мартюшев почему юнит-тесты не работают. история большого проекта
мартюшев   почему юнит-тесты не работают. история большого проектамартюшев   почему юнит-тесты не работают. история большого проекта
мартюшев почему юнит-тесты не работают. история большого проекта
Magneta AI
 

Ähnlich wie Konstantin slisenko - Design patterns (20)

Konstantin slisenko - Spring Framework
Konstantin slisenko - Spring FrameworkKonstantin slisenko - Spring Framework
Konstantin slisenko - Spring Framework
 
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in development, v 2.0
 
InterSystems Community and Projects in CIS November 2015
InterSystems Community and Projects in CIS November 2015InterSystems Community and Projects in CIS November 2015
InterSystems Community and Projects in CIS November 2015
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. Введние
 
закон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelinesзакон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelines
 
закон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelinesзакон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelines
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in developement
Konstantin Slisenko -  OSGi, Equinox, Eclipse plug-in developementKonstantin Slisenko -  OSGi, Equinox, Eclipse plug-in developement
Konstantin Slisenko - OSGi, Equinox, Eclipse plug-in developement
 
История проекта, который никогда не падает / Андрей Шетухин
История проекта, который никогда не падает / Андрей ШетухинИстория проекта, который никогда не падает / Андрей Шетухин
История проекта, который никогда не падает / Андрей Шетухин
 
Qt tool evaluation
Qt tool evaluationQt tool evaluation
Qt tool evaluation
 
"Опыт создания системы управления сборкой и тестированием" (полная)
"Опыт создания системы управления сборкой и тестированием" (полная)"Опыт создания системы управления сборкой и тестированием" (полная)
"Опыт создания системы управления сборкой и тестированием" (полная)
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot Starter
 
Intro
IntroIntro
Intro
 
Tdd php
Tdd phpTdd php
Tdd php
 
А.Левенчук -- смычка кортекса и экзокортекса
А.Левенчук -- смычка кортекса и экзокортексаА.Левенчук -- смычка кортекса и экзокортекса
А.Левенчук -- смычка кортекса и экзокортекса
 
WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь...
 WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь... WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь...
WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь...
 
Developmentmanage3.0
Developmentmanage3.0Developmentmanage3.0
Developmentmanage3.0
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish
 
мартюшев почему юнит-тесты не работают. история большого проекта
мартюшев   почему юнит-тесты не работают. история большого проектамартюшев   почему юнит-тесты не работают. история большого проекта
мартюшев почему юнит-тесты не работают. история большого проекта
 
мартюшев почему юнит-тесты не работают. история большого проекта
мартюшев   почему юнит-тесты не работают. история большого проектамартюшев   почему юнит-тесты не работают. история большого проекта
мартюшев почему юнит-тесты не работают. история большого проекта
 

Mehr von beloslab

Mr. Keil Werner - Stem demo camp
Mr. Keil Werner - Stem demo campMr. Keil Werner - Stem demo camp
Mr. Keil Werner - Stem demo camp
beloslab
 
Mr. Keil Werner - UOMO 2011
Mr. Keil Werner - UOMO 2011Mr. Keil Werner - UOMO 2011
Mr. Keil Werner - UOMO 2011
beloslab
 
Mr. Ankur Sharma - PDE good practices
Mr. Ankur Sharma - PDE good practicesMr. Ankur Sharma - PDE good practices
Mr. Ankur Sharma - PDE good practices
beloslab
 
Konstantin Slisenko - Belarus Open Source Lab
Konstantin Slisenko - Belarus Open Source LabKonstantin Slisenko - Belarus Open Source Lab
Konstantin Slisenko - Belarus Open Source Lab
beloslab
 
Yuri Trukhin - IE9 Launch
Yuri Trukhin - IE9 LaunchYuri Trukhin - IE9 Launch
Yuri Trukhin - IE9 Launch
beloslab
 
Yuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practicesYuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practices
beloslab
 
Yuri Trukhin - Microsoft4students
Yuri Trukhin - Microsoft4studentsYuri Trukhin - Microsoft4students
Yuri Trukhin - Microsoft4students
beloslab
 
Yuri Trukhin - Windows Phone 7
Yuri Trukhin - Windows Phone 7Yuri Trukhin - Windows Phone 7
Yuri Trukhin - Windows Phone 7
beloslab
 
Pavel Rumantsev - Java Script
Pavel Rumantsev - Java ScriptPavel Rumantsev - Java Script
Pavel Rumantsev - Java Script
beloslab
 
Sergey Gavruk - Mix11
Sergey Gavruk - Mix11Sergey Gavruk - Mix11
Sergey Gavruk - Mix11
beloslab
 
Pavel Rumantsev - Html5
Pavel Rumantsev - Html5Pavel Rumantsev - Html5
Pavel Rumantsev - Html5
beloslab
 
Aleksei Gomza - ASP.NET MVC3 data processing
Aleksei Gomza - ASP.NET MVC3 data processingAleksei Gomza - ASP.NET MVC3 data processing
Aleksei Gomza - ASP.NET MVC3 data processing
beloslab
 
Aleksei Gomza - Web-applications and ASP
Aleksei Gomza - Web-applications and ASPAleksei Gomza - Web-applications and ASP
Aleksei Gomza - Web-applications and ASP
beloslab
 
Sergey Gavruk - WebMatrix
Sergey Gavruk - WebMatrixSergey Gavruk - WebMatrix
Sergey Gavruk - WebMatrix
beloslab
 

Mehr von beloslab (14)

Mr. Keil Werner - Stem demo camp
Mr. Keil Werner - Stem demo campMr. Keil Werner - Stem demo camp
Mr. Keil Werner - Stem demo camp
 
Mr. Keil Werner - UOMO 2011
Mr. Keil Werner - UOMO 2011Mr. Keil Werner - UOMO 2011
Mr. Keil Werner - UOMO 2011
 
Mr. Ankur Sharma - PDE good practices
Mr. Ankur Sharma - PDE good practicesMr. Ankur Sharma - PDE good practices
Mr. Ankur Sharma - PDE good practices
 
Konstantin Slisenko - Belarus Open Source Lab
Konstantin Slisenko - Belarus Open Source LabKonstantin Slisenko - Belarus Open Source Lab
Konstantin Slisenko - Belarus Open Source Lab
 
Yuri Trukhin - IE9 Launch
Yuri Trukhin - IE9 LaunchYuri Trukhin - IE9 Launch
Yuri Trukhin - IE9 Launch
 
Yuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practicesYuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practices
 
Yuri Trukhin - Microsoft4students
Yuri Trukhin - Microsoft4studentsYuri Trukhin - Microsoft4students
Yuri Trukhin - Microsoft4students
 
Yuri Trukhin - Windows Phone 7
Yuri Trukhin - Windows Phone 7Yuri Trukhin - Windows Phone 7
Yuri Trukhin - Windows Phone 7
 
Pavel Rumantsev - Java Script
Pavel Rumantsev - Java ScriptPavel Rumantsev - Java Script
Pavel Rumantsev - Java Script
 
Sergey Gavruk - Mix11
Sergey Gavruk - Mix11Sergey Gavruk - Mix11
Sergey Gavruk - Mix11
 
Pavel Rumantsev - Html5
Pavel Rumantsev - Html5Pavel Rumantsev - Html5
Pavel Rumantsev - Html5
 
Aleksei Gomza - ASP.NET MVC3 data processing
Aleksei Gomza - ASP.NET MVC3 data processingAleksei Gomza - ASP.NET MVC3 data processing
Aleksei Gomza - ASP.NET MVC3 data processing
 
Aleksei Gomza - Web-applications and ASP
Aleksei Gomza - Web-applications and ASPAleksei Gomza - Web-applications and ASP
Aleksei Gomza - Web-applications and ASP
 
Sergey Gavruk - WebMatrix
Sergey Gavruk - WebMatrixSergey Gavruk - WebMatrix
Sergey Gavruk - WebMatrix
 

Konstantin slisenko - Design patterns

  • 1. Шаблоны проектирования © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 2. План Что такое шаблон проектирования? История появления Преимущества и критика Классификация шаблонов проектирования Примеры некоторых шаблонов Моделирование системы управления движением транспорта на перекрёстке с применением шаблонов проектирования Выводы © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 3. Что такое шаблон проектирования? В процессе написания программ (как и в любой другой области) часто возникают похожие задачи Мы люди умные, и не хотим каждый раз “изобретать велосипед” Мы можем выработать готовые решения для этих похожих задач и использовать их при необходимости Такие решения называются шаблонами проектирования © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 4. Что такое шаблон проектирования? Шаблон проектирования (англ. design pattern) – многократно используемое решение распространённых задач при разработке программного обеспечения По своей сути шаблоны – абстрактные решения для абстрактных ситуаций © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 5. История появления Шаблоны проектирования впервые появились в строительной архитектуре. Человечество на сегодняшний день: 5000 лет опыта в строительстве Менее 40 лет опыта в разработке и проектировании ПО © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 6. История появления Кристофер Александер – архитектор и филосов. Две книги: “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
  • 7. Преимущества Стандартный шаблон можно хорошо проработать В программах, где он используется, будет меньше кода, потенциально содержащего ошибки Упрощается коммуникации между программистами Если два программиста говорят об одной и той же ситуации, но разными словами – они могут друг друга не понять. Когда они говорят о стандартном шаблоне – обоим понятно, о чём идёт речь. Легче разобраться в новой системе – в ней есть знакомые части Всё придумано до нас Существует множество готовых и проверенных временем стандартных шаблонов. Мы можем использовать их в своих программах. © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 8. Критика Зацикливание на шаблонах порождает привычку пользоваться стандартными вещами и отучает нас придумывать нестандартные решения Шаблоны часто применяют слепо, поэтому использование оборачивается только ограничениями: “У нас есть задача - этот шаблон лучше всего её решает - выбираем его“ – правильно “Я знаю клёвый шаблон - давайте подгоним под него задачу” – не правильно © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 9. Классификация шаблонов Основные Порождающие Структурные Поведенческие Разделяющие Архитектурные Анти-паттерны И другие © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 10. Классификация шаблонов Основные Фундаментальные, используются другими шаблонами 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
  • 11. Классификация шаблонов Структурные Описывают, как их классов и объектов собираются более крупные структуры 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
  • 12. Классификация шаблонов Разделяющие Описывают, как их классов и объектов собираются более крупные структуры Filter, composite, read only interface Архитектурные Определяют взаимодействие между компонентами. Увеличивают его гибкость Modev-view-controller, layer, client-server… Анти-паттерны Как не следует поступать при разработке программ © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 13. Singleton (одиночка) Гарантирует, что у класса есть только один экземпляр и предоставляет к нему глобальную точку доступа Сам класс запрещает создание дополнительных экземпляров © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 14. Singleton (одиночка) publicclass Singleton { privatestatic Singleton instanse; private String message = "Hello, I'm Singleton!"; private Singleton() { } publicstaticsynchronized Singleton getInstanse() { if (instanse == null) { instanse = new Singleton(); } returninstanse; } publicvoid say() { System.out.println(message); } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 15. Singleton (одиночка) Цели использования Централизованное управление ресурсом Доступ из любой точки программы Создание объекта требует больших ресурсов памяти или процессора Примеры из жизни Текущий проигрываемый аудиоклип в плеере Текущий пользователь в системе Класс для локализации Spring applicationcontext (требует много ресурсов) Hibernate session factory (при создании считывает конфигурационные файлы) © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 16. Builder (Строитель) Делает процесс создания сложного объекта независимым от того, как конструируются сами части и как они взаимодействуют между собой Состоит из нескольких ролей: Builder - определяет, как создаются части Director -определяет, как собирается объект из этих частей Product – то, что получается в результате построения © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 17. Builder (Строитель) classPizza { privateString dough = ""; privateString sauce = ""; privateString topping = ""; publicvoidsetDough(String dough) { this.dough= dough; } publicvoidsetSauce(String sauce) { this.sauce= sauce; } publicvoidsetTopping(String topping) { this.topping= topping; } } abstractclassPizzaBuilder { protectedPizza pizza; publicPizza getPizza() { returnpizza; } publicvoidcreateNewPizzaProduct() { pizza = new Pizza(); } publicabstractvoidbuildDough(); publicabstractvoidbuildSauce(); publicabstractvoidbuildTopping(); } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 18. Builder (Строитель) classHawaiianPizzaBuilderextendsPizzaBuilder { publicvoidbuildDough() { pizza.setDough("cross"); } publicvoidbuildSauce() { pizza.setSauce("mild"); } publicvoidbuildTopping(){ pizza.setTopping("ham+pineapple"); } } classSpicyPizzaBuilderextendsPizzaBuilder { publicvoidbuildDough() { pizza.setDough("pan baked"); } publicvoidbuildSauce() { pizza.setSauce("hot"); } publicvoidbuildTopping() { pizza.setTopping("pepperoni+salami"); } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 19. Builder (Строитель) classCook { privatePizzaBuilderpizzaBuilder; publicvoidsetPizzaBuilder(PizzaBuilderpb) { pizzaBuilder= pb; } publicPizza getPizza() { returnpizzaBuilder.getPizza(); } publicvoidconstructPizza() { pizzaBuilder.createNewPizzaProduct(); pizzaBuilder.buildDough(); pizzaBuilder.buildSauce(); pizzaBuilder.buildTopping(); } } publicclassBuilderExample { publicstaticvoid main(String[] args) { Cook cook = new Cook(); PizzaBuilderhawaiianPizzaBuilder = newHawaiianPizzaBuilder(); PizzaBuilderspicyPizzaBuilder = newSpicyPizzaBuilder(); cook.setPizzaBuilder(hawaiianPizzaBuilder); cook.constructPizza(); Pizza hawaiian = cook.getPizza(); cook.setPizzaBuilder(spicyPizzaBuilder); cook.constructPizza(); Pizza spicy = cook.getPizza(); } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 20. Builder (Строитель) Пример– выборка товара из каталога по сложным критериям При выборе очередного критерия могут открываться новые контролы Builder: различный для каждого типа товаров: фотоаппараты, телефоны, плееры Director: форма выбора товара Product: объект с критериями © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 21. Abstract Factory (Абстрактная фабрика) Интерфейс для создания группы объектов, принадлежащих одному набору классов и используемых совместно Конкретные классы созданных объектов неизвестны Система не зависит от того, как создаются объекты Логика создания объектов спрятана в фабрике Абстрактная фабрика переопределяется в конкретных классах-фабриках © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 22. Abstract Factory (Абстрактная фабрика) Пример –различные стили пользовательского интерфейса Мы хотим, чтобы в программе можно было поменять тему оформления Описываем интерфейс для фабрики, которая создаёт компоненты пользовательского интерфейса: кнопки, текстовые поля, списки, и т.д. Для каждой темы делаем свою реализацию фабрики В любой момент подменяем одну фабрику на другуюи внешний вид пользовательского интерфейса меняется © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 23. Abstract Factory (Абстрактная фабрика) © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 24. Abstract Factory (Абстрактная фабрика) interfaceGUIFactory { publicButton createButton(); } classWinFactoryimplementsGUIFactory { publicButton createButton() { returnnewWinButton(); } } classLinuxFactoryimplementsGUIFactory { publicButton createButton() { returnnewLinuxButton(); } } interface Button { publicvoid paint(); } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 25. Abstract Factory (Абстрактная фабрика) classWinButtonimplements Button { publicvoid paint() { System.out.println("I'm a WinButton"); } } classLinuxButtonimplements Button { publicvoid paint() { System.out.println("I'm an LinuxButton"); } } class Application { public Application(GUIFactory factory) { Button button = factory.createButton(); button.paint(); } } publicclass Main{ publicstaticvoid main(String[] args) { new Application(new LinuxFactory()); } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 26. Observer (Наблюдатель) Второе название – “издатель-подписчик” Один объект генерирует события, другие объекты эти события получает и на них реагируют Первый объект – наблюдаемый (издатель), остальные – наблюдатели (подписчики) © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 27. Observer (Наблюдатель) importjava.util.Observable; importjava.util.Observer; publicclassMyObservableextends Observable { publicvoiddoSomething() { setChanged(); notifyObservers(); } } publicclassMyObserverimplementsObserver { publicvoid update (Observable obj, Object arg) { System.out.println(“updated”); } } publicclassMyApp { publicstaticvoid main(String args[]) { MyObservable a = newMyObservable(); MyObserver b = newMyObserver(); a.addObserver(b); a.doSomething(); } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 28. Observer (Наблюдатель) Пример – диаграмма в Excell, построенная по таблице При изменении данных в таблице – меняется диаграмма Объект “диаграмма” является подписчиком всех объектов “ячейка” © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 29. Strategy (Стратегия) Общий интерфейс для абстрактного алгоритма Разные реализации конкретных алгоритмов - стратегий Если нужно поменять алгоритм – подменяем одну стратегию другой © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 30. Strategy (Стратегия) classStrategyExample { publicstaticvoid main(String[] args) { IStragtegymyStrategy; myStrategy = newAddStrategy(); intresultA = myStrategy.count (3,4); myStrategy = newMultStrategy(); intresultB = myStrategy.count(3,4); } } interface Strategy { int count(int a, int b); } classAddStrategyimplementsIStrategy { publicint count(int a, int b) { return a + b; } } classMultStrategyimplementsIStrategy { publicint count(int a, int b) { return a * b; } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 31. Strategy (Стратегия) Пример 1 – фильтры в Photoshop, на вход подаётся изображение, к нему применяется стратегия-фильтр Пример 2 – поведение ботов в играх Пример 3 – Forex, каждый участник может реализовать свой алгоритм, который будет вести торги © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 32. Facade (Фасад) Единая обёртка для группы классов Мы пользуемся фасадом и не думаем о классах, которые лежат за ним Уменьшается связанность между частями системы © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 33. Facade (Фасад) Пример – любые библиотеки и модули, у которых описан интерфейс © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 34. Facade (Фасад) publicclassMessageHeader { private String from; private String to; public String getFrom() { return from; } publicvoidsetFrom(String from) { this.from = from; } public String getTo() { return to; } publicvoidsetTo(String to) { this.to = to; } } publicclassMessageBody { private String text; public String getText() { return text; } publicvoidsetText(String text) { this.text = text; } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 35. Facade (Фасад) publicclass Message { privateMessageBody body; privateMessageHeader header; publicMessageBodygetBody() { return body; } publicvoidsetBody(MessageBody body) { this.body = body; } publicMessageHeadergetHeader() { return header; } publicvoidsetHeader(MessageHeader header) { this.header = header; } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 36. Facade (Фасад) publicclassMessageCreatorFacade { private Message message = new Message(); privateMessageHeadermh = newMessageHeader(); privateMessageBodymb = newMessageBody(); publicvoidsetFrom(String from) { mh.setFrom(from); } publicvoidsetTo(String to) { mh.setTo(to); } publicvoidsetText(String text) { mb.setText(text); } public Message createMessage() { message.setBody(mb); message.setHeader(mh); return message; } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 37. Моделируем систему управления движением на перекрёстке Первый этап:GUI-интерфейс вместо светофоров – картинки вместо датчиков – кнопки Представление и логика должны быть разделены Кнопки и картинки должны замениться драйверами реальных устройств Переключение светофоров задаётся таблицей © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 38. Таблица переключений © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 39. Требования к системе Система должна иметь возможность конфигурирования под любой перекрёсток Система должна поддерживать различные режимы работы: обычное переключение ночной режим (датчик фиксирует приближение автомобиля ему включается зелёный свет) К системе должны подключаться любые модели и типы светофоров В любой момент пересечение перекрёстка должно быть безопасным © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 40. Мой вариант © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 41. Выводы Использование паттернов избавляет от необходимости постоянно придумывать новые решения В этом как положительный, так и отрицательный момент Использование паттернов делает код менее подверженным ошибкам Знание паттернов упрощает коммуникации между разработчиками Зная паттерны - мы имеем множество готовых решений наших задач © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
  • 42. Спасибо за внимание Презентацию можно будет найти на сайте, когда он откроется  © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam