Паттерны проектирования Введение Бреслав А. А. Что такое «хороший дизайн» Точного универсального ответа на этот вопрос нет Есть стандартные решения для определенных задач – паттерны Предложены хорошими.
Download
Report
Transcript Паттерны проектирования Введение Бреслав А. А. Что такое «хороший дизайн» Точного универсального ответа на этот вопрос нет Есть стандартные решения для определенных задач – паттерны Предложены хорошими.
Паттерны
проектирования
Введение
Бреслав А. А.
Что такое «хороший дизайн»
Точного универсального ответа на этот
вопрос нет
Есть стандартные решения для
определенных задач – паттерны
Предложены
хорошими специалистами
Проверены временем
Составляют удобный словарь для общения
Бреслав А. А.
Паттерны проектирования. Введение
Gang of Four (GoF)
Книга Э. Гаммы, Р. Хелма, Р. Джонсона и
Дж. Влиссидеса – «банда четырех»
Вышла
в 1995 году
Примеры на C++, кое-что на SmallTalk
С тех пор ничего принципиально нового
не придумали
Примеры
для других языков
Несколько новых паттернов
Бреслав А. А.
Паттерны проектирования. Введение
Что такое паттерн проектирования
Типовая схема решения определенной
задачи
Название
(возможно, несколько)
Описание задачи
Схема решения
Обсуждение результатов
Бреслав А. А.
Паттерны проектирования. Введение
Пример: Observer / Listener
Названия:
«Observer»
(GoF) / «Listener» (JDK)
Задача: один объект должен оповещать
несколько других о том, что произошло
некоторое событие (например, его состояние
изменилось)
Решение:
создать
интерфейс Listener
регистрировать слушателей в объекте-сервере
Бреслав А. А.
Паттерны проектирования. Введение
Что не является паттерном
Готовый класс
Структуры
данных
Потоки
и
т. д.
Архитектура в целом
Client-Server
Бреслав А. А.
Паттерны проектирования. Введение
Определение паттерна (GoF)
Описание взаимодействия объектов и
классов, адаптированных для решения
общей задачи проектирования в
конкретном контексте
Бреслав А. А.
Паттерны проектирования. Введение
Для чего применяются паттерны
Чтобы создать хороший дизайн
Инкапсуляция
Повторное
использование
Снижение зависимостей
…
Бреслав А. А.
Паттерны проектирования. Введение
Классификация паттернов (GoF)
Порождающие паттерны
Организуют
Структурные паттерны
Организуют
структуру классов
Паттерны поведения
Организуют
создание объектов
поведение объектов
Пример: Observer – паттерн поведения
Бреслав А. А.
Паттерны проектирования. Введение
Несколько основных паттернов
Singleton – порождение
String.CASE_INSENSITIVE_ORDER
Template Method – поведение
AbstractCollection
Adapter – структура
StringReader
Strategy (Delegate) – поведение
Comparator
Abstract Factory - порождение
Бреслав А. А.
Паттерны проектирования. Введение
Singleton – «одиночка»
Может существовать всего один объект
данного класса
Например,
когда важно только поведение, а не
состояние (Comparator)
Отличие от класса со статической
реализацией: полиморфизм
Примеры:
String.CASE_INSENSITIVE_ORDER
Null Object
Boolean
Бреслав А. А.
(TRUE и FALSE)
Паттерны проектирования. Введение
Singleton: реализация в Java
private-конструктор
Единственный объект - константа
Ленивая инициализация:
не
нужно создавать объект, если он никому
не понадобился
Бреслав А. А.
Паттерны проектирования. Введение
Singleton: пример кода (1)
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {
}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
Бреслав А. А.
Паттерны проектирования. Введение
Factory method
Метод, инкапсулирующий создание
объекта
Возможность
Integer.valueOf(int)
Возможность
подмены реализации
В будущем можно возвращать объекты классанаследника, не изменяя клиентов
Бреслав А. А.
кеширования
при явном вызове конструктора так не получится
Паттерны проектирования. Введение
Singleton: пример кода (2)
public class Singleton {
public static final Singleton INSTANCE =
new Singleton();
private Singleton() {
}
}
Бреслав А. А.
Паттерны проектирования. Введение
Template method
Метод регламентирует порядок вызова
других методов, реализуемых в
подклассах
Примеры:
AbstractCollection
Virtual
Бреслав А. А.
Interface
Паттерны проектирования. Введение
Template method – реализация в
Java
Сам метод, как правило, объявляется
final
Методы, которые он вызывает, обычно
объявляются
protected
абстрактные, но могут иметь и
«реализацию по умолчанию»
Бреслав А. А.
Паттерны проектирования. Введение
Template method – пример кода
public abstract class TemplateMethodExample {
public final void perform() {
try {
doPerform();
} catch (IllegalStateException e) {
handleException(e);
}
}
protected abstract void doPerform()
throws IllegalStateException;
protected abstract void
handleException(IllegalStateException e);
}
Бреслав А. А.
Паттерны проектирования. Введение
Factory method
Частный случай Template method
Полиморфный метод для создания
объектов
В подклассах его можно
переопределить, чтобы создавать
объекты специфичных классов
Бреслав А. А.
Паттерны проектирования. Введение
Factory method – пример кода
public abstract class MultiMap {
private final Map map = new HashMap();
public Object get(Object[] keys) {
return map.get(createKey(keys));
}
public void put(Object[] keys, Object value) {
map.put(createKey(keys), value);
}
public abstract Object createKey(Object[] keys);
}
Бреслав А. А.
Паттерны проектирования. Введение
Adapter (Wrapper)
Задача: для некоторой цели нужно
использовать класс, API которого для этой
цели не подходит
Решение: создать класс с нужным
интерфейсом, делегирующий существенные
операции исходному классу
Примеры:
StringReader
Бреслав А. А.
Паттерны проектирования. Введение
Adapter – реализация в Java
Класс-адаптер имеет конструктор,
принимающий объект адаптируемого
класса
Как правило, есть метод,
возвращающий «завернутый» объект
Бреслав А. А.
Паттерны проектирования. Введение
Adapter – пример кода
public class IntAsBitList extends
AbstractList<Integer> {
private int value;
public IntAsBitList(int x) {
value = x;
}
public Integer get(int index) {
if ((index < 0) || (index > size())) {
throw new IndexOutOfBoundsException();
}
return (value & (1 << index)) >> index;
}
public int size() {
return 32;
}
}
Бреслав А. А.
Паттерны проектирования. Введение
Adapter – возможности
Замена наследования делегированием
Иногда
заменяет множественное
наследование классов
Создание представлений
subList
checkedCollection
Здесь
правильнее употреблять название
Wrapper - обертка
Бреслав А. А.
Паттерны проектирования. Введение
Strategy (Delegate)
Задача: передать участок кода в качестве
значения (например, параметра методу)
Решение: определить API этого кода,
реализовать его и передать объект
реализации
Примеры:
Comparator
Observer
(Listener)
LayoutManager
Бреслав А. А.
Паттерны проектирования. Введение
Strategy – реализация в Java
Как правило, API регламентируется
интерфейсом
Часто для реализации применяются
анонимные inner-классы
Стратегии часто бывают синглетонами
Бреслав А. А.
Паттерны проектирования. Введение
Strategy – пример кода (1)
public class StrategyExample {
interface Filter { // Стратегия
boolean accept(char c);
}
public static String
filterString(String s, Filter f) {
StringBuilder b = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (f.accept(s.charAt(i))) {
b.append(s.charAt(i));
}
}
return b.toString();
}
}
Бреслав А. А.
Паттерны проектирования. Введение
Strategy – пример кода (2)
public static void main(String[] args) {
Filter strategy = new Filter() {
public boolean accept(char c) {
return Character.isDigit(c);
}
};
System.out.println(
filterString("123hgf231", strategy));
}
Бреслав А. А.
Паттерны проектирования. Введение
Strategy – пример кода (3)
public static void main(String[] args) {
System.out.println(
filterString("123hgf231", new Filter() {
public boolean accept(char c) {
return Character.isDigit(c);
}
}));
}
Бреслав А. А.
Паттерны проектирования. Введение
Abstract Factory
Задача: есть набор интерфейсов
(абстрактных классов), создать для
каждого из них объекты-реализации так,
чтобы они были согласованы
Решение: абстрактная фабрика –
стратегия создания объектов
Бреслав А. А.
Паттерны проектирования. Введение
Abstract Factory - пример
GraphFactory
Graph
Vertex
Edge
WayVertex
WeightedEdge
+createGraph()
+createVertex()
+createEdge()
ListGraphFactory
ListGraph
MatrixGraph
way
WeightedGraphFactory
Бреслав А. А.
Паттерны проектирования. Введение
weight
Abstract Factory - использование
Обходы графа – SimpleGraphFactory
Алгоритмы поиска кратчайших путей –
WeightedGraphFactory
Для создания собственного набора
данных в вершине/ребре – новая
реализация фабрики
Бреслав А. А.
Паттерны проектирования. Введение
Источники
Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес,
«Приемы объектно-ориентированного
проектирования. Паттерны проектирования»
М. Гранд, «Шаблоны проектирования в Java»
Bruce Eckel, «Thinking in Patterns with Java»
http://www.mindviewinc.com/
Бреслав А. А.
Паттерны проектирования. Введение
Вопросы
Бреслав А. А.
Паттерны проектирования. Введение