Паттерны проектирования Введение Бреслав А. А. Что такое «хороший дизайн» Точного универсального ответа на этот вопрос нет  Есть стандартные решения для определенных задач – паттерны   Предложены хорошими.

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/
Бреслав А. А.
Паттерны проектирования. Введение
Вопросы
Бреслав А. А.
Паттерны проектирования. Введение