Pull to refresh

Паттерны проектирования для человеков.

Reading time4 min
Views29K
Была задача в максимально короткие сроки (зачет нужно было сдавать) человеку далекому от программирования объяснить паттерны на самом простом уровне.
В результате баланса простоты изъяснения и адекватности, образовалась эта шпаргалка.
Просьба оценить эту самую адекватность и простоту.

Ликбез:
Инкапсуляция — сокрытие сущности объекта за интерфейсом (нам пох как у нас хранится картинка, нам нада только уметь выводить еще на экран, ресайзить, поворачивать...)
Экземпляр класса — объект :)

Краткое введение:
Паттерны делятся на 3 основные группы:
1. Порождающие — паттерны отвечающие за создание объектов;
2. Структурные — определяют структуру представления классов/объектов;
3. Паттерны поведения — паттерны для инкапсуляции (сокрытия) действий над объектами.

1. Порождающие


Abstract Factory — создает объекты похожих классов.
У нас есть абстрактный класс и наследники, создается абстрактная фабрика и конкретные фабрики для наследников. Необходим для того что бы отделить методику создания объектов разных классов. Классы должны быть связаны.
Пример на C#
На русском с рисунками

Builder — отделяет создание объекта и его представления.
Позволяет при вызове одного и того же метода создания, получить разные результаты.
Пример на C#
На русском с рисунками

Singleton — гарантирует наличие одного экземпляра класса.
Используется, если в системе нужно гарантировать наличие одного экземпляра класса (объекта). Например, в системе может быть только один бланк учета черной бухгалтерии. Это аналог глобальной переменной, но намного круче.
Пример на C#
На русском с рисунками

2. Структурные


Adapter — адаптирует :) интерфейс одного класса к другому.
Допустим есть два класса, и мы имеем доступ только к интерфейсам (код менять низя). И нужно наладить взаимодействие. Тогда применяется паттерн. Он берет интерфейс класса А и его методы преобразовывает для класса В.
Пример: есть класс для работы с комплексными числами, у него методы ToCompl(int i) и есть другой класс который знает про комплексные числа но думает что там метод называется ConvertToComplex(int i), делаем адаптер для первого класса, который будет иметь метод ConvertToComplex, а в нем вызывать ToCompl (пример тупой, оперирует только названиями, а в реале там можно заменять все, например вызывать не 1 метод, а 15)
Пример на C#
На русском с рисунками

Composite — позволяет создать один простой интерфейс для кучи похожих классов.
Допустим есть разные геометрические фигуры(Line, Circle), наследуем их от класса Figure у которого есть метод Draw и тем самым мы обеспечим простой вызов прорисовки для всех наследников.
Пример на C#
На русском с рисунками


Decorator Динамическое добавление функционала для класса.
Например есть класс фотка, и нам нада навесить рамку, делаем класс который будет выводит фотку (метод класса Фотка) и потом выводить рамку (уже своими методами)
Пример на C#
На русском с рисунками

Proxy — заменяет класс на себя :)
Получается что для всей системы прокси выглядит как необходимый класс, но не является таковым.
Например есть большой объект (пдф документ) и нам нада его отобразить на экране. Грузить весь нельзя (в память не влезет). Поэтому делаем прокси который будет постранично грузить и выводить, но выглядеть он будет как настоящий документ.
Пример на C#
На русском с рисунками

3. Паттерны поведения


Command — инкапсулирует действие в объект.
Например есть менюха которая должна выводить сообщение. Мы не просто в обработчике меню пишем вывод, а делаем класс который это делает. Дерево таких классов позволяет организовать такую штуку как «Отменить/пофторить», фактически мы можем сохранять наши действия.
Пример на C#
На русском с рисунками

Iterator — позволяет обходить коллекцию объектов. Например есть вектор (массив) и мы вместо [] пишем методы Next, Previos. Таким образом мы не привязались к массив и в дальнейшем можем заменить его на другую структуру.
Пример на C#
На немецком с рисунками

Memento — позволяет сохранить состояние объекта. Например в фотошопе у нас есть отмена команд, мы применили ацкий фильтр который всю фотку испоганил, обратной ф-ции этого фльтра нет (паттерн Команда не проканает), мы перед применением фильтра, тупо сохраняем фотку и потом можем ее восстановить.
Пример на C#
На украинсокм с рисунками

Observer — налаживает взаимодействие объектов. Например есть формочка, мы нажимаем кнопочку и в текстовом поле выводится «42», можно написать тупо в обработчике кнопки типа изменить поле, но это не тру. Тру: создаем объект Наблюдатель(обычно это сингелтон) и в кнопочке вызываем метод в этом Наблюдателе, а он уже предеает это сообщение всем текстовым полям (их же может стать больше :)
Пример на C#
На русском с рисунками

Mediator — тоже самое что и Observer, но там отношение «Много к многим».
Например у нас не только кнопочка, а еще и менюшка есть.
Пример на C#
На украинсокм с рисунками

State — позволяет подменять класс его наследниками.
Например, есть заявка, она или обработана или необработана (третьего не дано). Мы для этих двух состояний делаем классы и наследуем от абстрактного класса СостояниеЗаявки, у которого есть метод ИзменитьСостояние. В реализации этого метода мы будем заменять текущее состояние на нужный нам объект (Обработано, Необработано) эти состояния обычно сингилтоны.
Пример на C#
На украинсокм с рисунками

Strategy — позволяет инкапсулировать алгоритмы.
Например нам нужно сортировать массив и нам пофигу каким методом (пузырьком, быстрая...) поэтому создаем класс, а от него наследников — конкретные алгоритмы, и уже там — методы Отсортировать, а у же в методах конкретных сортировок реализуем их. Это позволяет что бы другие классы вобще не знали как и что мы сортируем.
Пример на C#
На русском с рисунками

Visitor — позволяет навесить функционал на уже готовый класс.
Например, есть работник, у него есть черная и белая зарплата. Считается по разному. Класс работника менять низя. Делаем посетителя, у которого будет два метода ПосчитатьРеально и ПосчитатьДляНалоговиков. Он будет брать объект Работник, вытаскивать из него ставку и по разному считать.
Пример на C#
На итальянском с рисунками

upd: Технический редактор — Антон.
Tags:
Hubs:
+20
Comments23

Articles

Change theme settings