Введение в паттерны проектирования
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 64 из 87.
Шаблоны проектирования — это проверенные решения распространённых проблем, с которыми разработчики неоднократно сталкиваются при создании программного обеспечения. Вместо того чтобы каждый раз изобретать велосипед, вы можете применять эти проверенные временем шаблоны для решения повторяющихся задач проектирования.
Представляй design patterns как чертежи. Они не дают тебе готовый код для копирования и вставки, а описывают, как структурировать свои classes и objects, чтобы решить конкретный тип задачи. Изучаемые тобой patterns используют уже освоенные тобой концепции OOP: наследование, интерфейсы, полиморфизм и композицию.
Design patterns делятся на три основные категории:
| Category | Назначение | Примеры |
|---|---|---|
| Creational | How objects are created | Singleton, Factory, Builder |
| Структурные | How objects are composed | Adapter, Decorator, Composite |
| Behavioral | How objects communicate | Observer, Strategy, Command |
Зачем изучать шаблоны проектирования? Они дают тебе общий словарь с другими разработчиками: фраза «используй здесь Factory» мгновенно передаёт сложную идею. Они также помогают писать более гибкий и сопровождаемый код, применяя такие принципы, как «программируй на основе interface, а не реализации».
На следующих уроках ты будешь implement несколько основных patterns, начиная с порождающих patterns, таких как Singleton и Factory, а затем перейдёшь к поведенческим patterns, таким как Observer и Strategy.
Задание
ЛегкоДавайте создадим простой классификатор pattern, который продемонстрирует ваше понимание трёх категорий design pattern! Вы создадите систему, которая классифицирует patterns и объясняет их назначение, организовав код в нескольких файлах.
Вы создадите три файла:
Pattern.java: Create интерфейс с именемPattern, который определяет контракт для всех design patterns. Ваш интерфейс должен declare два метода:String getCategory(), который возвращает категорию pattern (Creational, Structural или Behavioral), иString getPurpose(), который возвращает описание того, что does эта категория patterns.PatternInfo.java: Create три класса, которые implement ваш интерфейсPattern, каждый из которых представляет одну категорию design patterns:CreationalPattern— должен возвращать"Creational"для категории и"How objects are created"для назначения.StructuralPattern— должен возвращать"Structural"для категории и"How objects are composed"для назначения.BehavioralPattern— должен возвращать"Behavioral"для категории и"How objects communicate"для назначения.Main.java: Объедините ваш классификатор pattern! Вы получите один input: имя pattern (String), которое будет одним из следующих значений:"Singleton","Factory","Adapter","Decorator","Observer"или"Strategy".На основе input создайте appropriate объект pattern:
"Singleton"и"Factory"являются Creational patterns"Adapter"и"Decorator"являются Structural patterns"Observer"и"Strategy"являются Behavioral patterns
Сохраните объект pattern в переменной типа
Pattern(интерфейс), демонстрируя принцип программирования через интерфейс. Затем Print следующие три строки:Pattern: [input pattern name]Category: [category from getCategory()]Purpose: [purpose from getPurpose()]
Вы получите один input: имя design pattern (String).
Это challenge закрепляет ключевую идею урока: design patterns организованы в категории на основе того, какую проблему они решают. Используя интерфейс, вы также практикуете принцип "programming to an interface, not an implementation" — основную концепцию, которая делает design patterns настолько powerful!
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String patternName = scanner.nextLine();
// TODO: Объявите переменную типа Pattern (интерфейс)
Pattern pattern = null;
// TODO: На основе patternName создайте соответствующий объект паттерна:
// - "Singleton" и "Factory" — порождающие паттерны
// - "Adapter" и "Decorator" — структурные паттерны
// - "Observer" и "Strategy" — поведенческие паттерны
// TODO: Выведите результат в следующем формате:
// Pattern: [имя введённого паттерна]
// Category: [категория из getCategory()]
// Purpose: [назначение из getPurpose()]
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»Потренируйтесь самостоятельно: Онлайн-компилятор Java