Паттерны проектирования java: Паттерны проектирования в Java
Паттерны проектирования в Java
2015-12-21
ООП и паттерны проектирования
Уверен, каждый программист слышал словосочетание «паттерны проектирования» (или шаблоны). Если очень коротко — это описание проблем, которые встречаются при написании объектно-ориентированного кода, а так же примеры решения этих проблем.
Спустя какое-то время паттерны начинают преследовать нас везде — на форумах, в статьях и даже в требованиях к вакансиям. Некоторые люди заболевают паттернофилией, начинают впиндюривать эти шаблоны направо и налево, видят их во снах, бредят ими… Одним словом — ужас.
Но, как сказал кто-то умный, — паттерны нужны для того, чтобы помочь реализовать какую-то идею, а не для того, чтобы уместить идею в рамки некоторого паттерна.
Надеюсь, цикл моих статей поможет вам сохранить хладнокровие в вопросах использования паттернов и при этом расширить свои познания в ООП.
За основу возьмем каталог паттернов из книги GoF — Design Patterns. А дальше как пойдет :).
В каждой статье я попытаюсь:
- объяснить, зачем конкретный паттерн нужен;
- привести пример его использования, по возможности из реальных Java проектов, в которых я принимал участие;
- рассказать об особенностях, мифах и подводных камнях;
- указать, где можно встретить реализацию паттерна в JDK.
Паттерны создания объектов
Первая группа — это creational паттерны. Они в той или иной степени работают с механизмами создания объектов.
- Singleton — обеспечиваем существование в системе ровно одного экземпляра некоторого класса;
- Factory Method — делегируем процесс создания объектов классам-наследникам;
- Prototype — клонируем объекты на основании некоторого базового объекта;
- Builder — отделяем процесс создания комплексного объекта от его представления;
- Abstract Factory — описываем сущность для создания целых семейств взаимосвязанных объектов.
Структурные паттерны
Вторая группа — структурные паттерны (structural). Они описывают создание более сложных объектов, либо упрощают работу с другими объектами сисетмы.
- Adapter — на основании некоторого класса создаем необходимый клиенту интерфейс;
- Facade — описываем унифицированный интерфейс для облегчения работы с набором подсистем;
- Composite — работаем с базовыми и составными объектами единым образом;
- Decorator — динамически добавляем новую функциональность некоторому объекту, сохраняя его интерфейс;
- Proxy — создаем объект, который перехватывает вызовы к другому объекту;
- Bridge — разделяем абстракцию от интерфейса, позволяя им меняться независимо;
- Flyweight — эффективно работаем с огромным количеством схожих объектов.
Поведенческие паттерны проектирования
Наконец, третья группа — поведенческие шаблоны (behavioral). Они определяют эффективные способы взаимодействия различных объектов в системе.
- Strategy — описываем набор взаимозаменяемых алгоритмов с единым интерфейсом;
- Iterator — обеспечиваем доступ к коллекциям объектов без раскрытия внутреннего устройства этих коллекций;
- Observer — создаем объект для отслеживания изменений в подсистеме и нотификации других подсистем;
- Memento — сохраняем внутреннее состояние объекта для последующего использования без нарушения инкапсуляции;
- Command — описываем объект, представляющий собой некоторое действие, которое можно выполнить в необходимый момент;
- Interpreter — определяем способ вычисления выражений некоторого языка;
- Mediator — создаем объект, которые регулирует взаимодействие между набором подсистем;
- State — позволяем объекту менять свое поведение при изменении его внутреннего состояния;
- Template method — описываем алгоритм, возлагая реализацию некоторых частей алгоритма на подклассы;
- Visitor — отделяем алгоритм от структуры, с которыми алгоритм работает;
- Chain of responsibility — пропускаем некоторый запрос через набор обработчиков событий, до тех пор пока запрос не будет обработан.
Антипаттерны проектирования
Считаю важным знать не только удачные способы решения задач, но и возможные ошибки при их решении.
Есть мнение, что необходимость в некоторых паттернах вызвана недостатком конкретного языка программирования. Может и так, но раз уж используемый нами язык не предоставляет нативный способ решения проблемы, то почему бы не воспользоваться идеей, которая уже кем-то проверена и является достаточно эффективной, если не оптимальной.
Паттерны/шаблоны проектирования
Паттерны (или шаблоны) проектирования описывают
типичные способы решения часто встречающихся
проблем при проектировании программ.
Каталог паттернов
Список из 22-х классических паттернов,
сгруппированых по предназначению.
Польза паттернов
Вы можете вполне успешно работать, не зная
ни одного паттерна. Но зная паттерны, вы
получаете ещё один инструмент в свой
личный набор профессионала.
Классификация
Паттерны отличаются по уровню сложности, охвата
и детализации проектируемой системы. Кроме
этого, их можно поделить на три группы,
относительно решаемых проблем.
История паттернов
Кто и когда придумал паттерны? Можно ли
использовать язык паттернов вне разработки
программного обеспечения?
Критика паттернов
Так ли паттерны хороши на самом деле?
Всегда ли можно их использовать?
Почему, иногда, паттерны бывают вредными?
Погружение в
Паттерны
Электронная книга о паттернах и
принципах проектирования. Доступна в
PDF/EPUB/MOBI. Включает в себя
архив с примерами на 9 языках
программирования.
Паттерны проектирования — Наблюдатель | Java master
Сегодня мы поговорим о паттернах проектирования и в частности о таком паттерне как наблюдатель. Иногда Вы можете встретить термин шаблоны проектирования. Это одно и тоже.
Паттерны проектирования — одни из самых важных инструментов разработчика. Они демонстрируют лучшие решения для задач реальной жизни языком программирования.
Можно писать код и без паттернов и никогда о них не задумываться, но в жизни каждого разработчика наступает момент, когда можно решить задачу «в лоб» без использования лучших практик, или же посмотреть, как эту задачу уже решали до Вас. Именно это и есть шаблоны проектирования. Они и есть лучшие практики задач, которые решались задолго до Вас.
Есть очень много шаблонов проектирования. Учить их все необязательно да и просто затруднительно. Нужно знать, что они есть и при необходимости — воспользоваться ими.
Сегодня я покажу паттерн наблюдатель или Observer, на английском. Это очень популярный и известный шаблон проектирования в программировании.
Вы наверняка знаете что такое лента новостей. Самые первые ленты новостей были RSS новости. Это когда читатели подписываются на обновления сайта и им автоматически поступают в ленту новые статьи, на которые они подписаны. Сейчас, наверное проще объяснить на примерах фейсбука и твиттера. Вы подписываетесь на обновление определенного аккаунта и видите его новые статьи или видео. Вот это и есть наблюдатель в реальной жизни.
Наблюдатель решает проблему автор/подписчик, когда один автор может иметь одного или много подписчиков.
Наблюдатель — это паттерн поведения. Для справки, согласно общепринятым нормам паттерны разделены на категории:
- порождающие паттерны;
- паттерны поведения;
- структурные паттерны.
Если говорить простым языком — когда один объект изменяет свое состояние, все его подчиненные объекты оповещаются автоматически.
Ниже представлена классическая диаграмма паттерна наблюдатель:
Идея данного шаблона проста. Один или несколько Наблюдателей (Observer на диаграмме) заинтересован в состоянии Объекта (Subject). Он подписывается на объект. Если в Объекте происходит то, что может быть интересно Наблюдателю — ему отправляется оповещение об изменении. Когда Наблюдателю больше не интересно состояние Объекта — он может отписаться от оповещений.
Эта схема примечательна тем, что для того, чтобы передать данные к наблюдателям Объекту не нужно знать кто они. Это уменьшает связывание кода, что делает разработку более гибкой, а код легко читаемым.
Вы уже пользовались наблюдателем но не догадывались об этом. Если Вы использовали GUI библиотеки такие как Swing, AWT, JavaFX, то наверняка «навешивали» ActionListener на кнопки или поля. Это и есть реализация наблюдателя. Когда кнопка изменяет свое состояние — в приложении срабатывает специальный метод, который подписан на изменение этой кнопки.
Так как тема сайта язык Java я покажу пример наблюдателя на джава. Дело в том, что данный шаблон уже реализован в стандартной библиотеке java и Вам не нужно «изобретать велосипед», чтобы воспользоваться этим паттерном.
Для того, чтобы сделать класс наблюдаемым нужно унаследовать его от класса Observable. Для отправки оповещения подписчикам нужно вызвать метод setChanged(). Я взял достаточно простую предметную область. Допустим у меня есть система, где пользователи заводят блог, а читатели выбирают интересные блоги и подписываются на новые статьи. Очень напоминает WordPress. Разумеется, что все очень упрощенно. Когда в блоге появляется новая статья — подписчики должны получить уведомление. Сейчас неважно как будет отправлено оповещение. Это может быть почта, соц сети, оповещение в браузере. Для нашего примера сделаем просто вывод в консоль.
import java.util.Observable;
- public String getArticle() {
return article;
}
- public void setArticle(String article) {
this.article = article;
setChanged();
}
}
Код довольно простой и не нуждается в комментариях. Заметьте, что когда вызывается метод setArticle идет вызов метода setChanged() для оповещения подписчиков.
Теперь реализуем подписчика. Для того, дать классу возможность стать подписчиком нужно имплементировать интерфейс Observer. Далее нужно реализовать единственный метод данного интерфейса update. Этот метод будет вызван при оповещении подписчика.
import java.util.Observable;
import java.util.Observer;
- public class Subscriber implements Observer {
@Override
// TODO Auto-generated method stub
- System.out.println(«New article is been created » + arg);
}
}
В методе выше, вместо вывода на консоль в более реальных проектах можно было бы вызвать метод отправки почты или браузерное оповещение.
Теперь посмотрим наш код в действии:
public class Main {
- public static void main(String[] args) {
Subscriber sub1 = new Subscriber();
Subscriber sub2 = new Subscriber();
Blog programmingBlog = new Blog();
Blog flowerBlog = new Blog();
programmingBlog.addObserver(sub1);
programmingBlog.addObserver(sub2);
flowerBlog.addObserver(sub2);
programmingBlog.setArticle(«Java tutorial»);
programmingBlog.notifyObservers(programmingBlog.getArticle());
flowerBlog.setArticle(«New Flowers!!!»);
flowerBlog.notifyObservers(flowerBlog.getArticle());
}
}
В коде выше я моделирую ситуацию из задания. Есть два блога: программирование, цветы. Есть два подписчика. Оба подписываются на программирование и второй еще и на цветы. Когда появляются новые записи в блогах мы оповещаем подписчиков методом notifyObservers. Он может принимать аргументы, а может быть и без аргументов.
Результат работы программы:
New article is been created Java tutorial
New article is been created Java tutorial
New article is been created New Flowers!!!
Все подписчики получили уведомление о новых статьях. Причем Blog ничего не знает о своих подписчиках. Он просто оповещает всех, кто подписался.
На этом все. Это только введение в паттерны проектирования и только первый пример. В следующих статьях постараюсь рассказать о других полезных шаблонах, которые очень упрощают жизнь программисту и делают код более читаемым и чистым.
Понравилась статья? Поделиться ссылкой:
Паттерны (шаблоны проектирования) Java — Видеоуроки
Как вы можете заставить шаблоны проектирования Java делать именно то, что вы хотите, и ускорить вашу карьеру менее чем за 1 неделю? Получите секретное оружие, которое каждый успешный Java-программист использует для написания кода, который можно многократно использовать, расширять и поддерживать в течение долгих лет… который использовался инженерами, которые принесли нам виртуальную машину Java и мощную экосистему…
Как и многие программисты моего поколения, я начал программировать на бейсике. После небольшого набега на Турбо Паскаль мой университет осторожно привел меня в C.
На протяжении всего моего университетского образования я изо всех сил пытался избавиться от вредных привычек, наделенных годами бейсика и C. Полиморфизм? Нет, я использовал операторы switch и условные выражения if.
Я был безумно продуктивен благодаря щедрому применению CTRL + C и CTRL + V. Частью моей работы был редактор для SDL, используемый для сетевых протоколов. Мой профессор и я продали это компании во Франции. Они посетили нас в университете Кейптауна, и им понравилась моя программа. Чтобы сделать его (редактор) идеальным, они хотели несколько изменений. Мне потребовалось всего несколько часов, чтобы закончить все, что они хотели.
Я использовал те же методы программирования из C и BASIC в моем коде C ++. Результатом стало множество операторов switch, распределенных по всей моей кодовой базе. Всякий раз, когда мне приходилось добавлять новый элемент дизайна, мне приходилось искать и изменять каждый оператор switch по очереди. Если бы я забыл один, что часто случалось, то одна функция больше не работала бы. Например, если я не изменил переключатель для печати, то мой новый элемент будет отображаться на экране, а не на распечатке. Каждый раз, когда я добавлял один элемент, мне приходилось проверять каждую функцию по очереди, чтобы убедиться, что все работает.
Этот тип поведения может быть нормальным, когда вы работаете только над этим кодом. Но это не делает чести Вам для счастливых товарищей по команде.
На моей первой настоящей работе мой наставник вручил мне книгу GoF и сказал: «Вот, ты должен это прочитать».
Большинство шаблонов показались мне знакомыми по многим годам написания кода на C ++. Я отложил это в сторону. Чему я могу научиться?
Год спустя я услышал Мартина Фаулера на конференции в Кейптауне. Он назвал «Шаблоны проектирования» самой значимой книгой по разработке программного обеспечения десятилетия.
Я поднял ее для второго чтения. Возможно, я что-то пропустил? Все это казалось очевидным с первого раза.
Я НЕ ПОНИМАЛ НИ СЛОВА ВО ВТОРОМ ЧИТАНИИ
Как могло случиться, что год опыта программирования сделал меня таким глупым? Конечно, реальное программирования должно иметь противоположный эффект, делая меня более ценным, как программист?
Действительно, так и было. Но когда я впервые прочитал книгу, мне не хватило понимания, чтобы понять ее истинную ценность. Слова Мартина Фаулера заставили меня во второй раз взять книгу, которую я отбросил как «совершенно очевидную».
Я боролся с каждым паттерном, пытаясь придумать места, где я видел его в нашем Java-проекте. Мы даже сформировали группу по изучению шаблонов дизайна, которая собиралась каждый пятничный обед.
МНОГИЕ КУРСЫ ОНЛАЙН ИМЕЮТ СЕРЬЕЗНЫЕ ОШИБКИ, КОТОРЫЕ БУДУТ ВРЕДИТЬ ВАМ!
Во время третьего чтения GoF у меня наконец-то появилась Эврика!. В каждом паттерне используется полиморфизм. Даже Синглтон. Это была ключевая концепция, используемая везде. Кроме того, в большинстве шаблонов используется комбинация наследования и композиции. В случае сомнений мы использовали композицию.
Если бы я знал все это во время учебы в университете, я мог бы избежать всех этих отвратительных высказываний.
Я погрузился в шаблоны, решив понять различные нюансы каждого дизайна. Я покупал книги, читал газеты, обратился к одному из авторов оригинальной книги GoF — Джону Флиссиду. Я даже провел технический обзор некоторых статей, написанных им для IBM (Composite1 и Composite2). Я изучал творчество Кристофера Александра, известного архитектора, чей язык шаблонов клонировало сообщество разработчиков программного обеспечения. После нескольких месяцев подготовки я был готов преподавать свой первый курс по шаблонам проектирования Java.
За свою 18-летнюю историю и с бесчисленными изменениями наш Курс по разработке шаблонов остается актуальным и полезным. Шаблоны Iterator, Composite и Strategy так же важны для Java 11, как и для Java 1.1. Как и в 90-е годы, шаблоны по-прежнему делают программистов более продуктивными и способными лучше общаться.
Java 8 добавил лямбды и ссылки на методы на язык. Это облегчает использование некоторых шаблонов, таких как Command. Методы по умолчанию в интерфейсах означают, что мы не всегда вынуждены использовать абстрактные классы.
Никто не любит прямые ссылки в книгах или курсах. «Не беспокойся об этом, мы сделаем это в следующей главе», как правило, отвлекает нас. Мы стараемся иметь как можно меньше из них.
Мы начнем с обширного знакомства с Java на современных виртуальных машинах. Многие проблемы в оригинальной книге «Банды четырех» связаны с тем, что у нас была только статическая компиляция. Java может оптимизировать наш код на лету. JIT-компилятор может даже встроить полиморфные вызовы методов, если он может определить, что это безопасно. Если позже появится другой тип подкласса, он отменит эту оптимизацию. Расходы на косвенные ссылки также указываются. Слишком много объектов? Не беспокойтесь, сборщик мусора прекрасно справляется с этим.
Одной из начальных заповедей является та, которая относится к мерономии. Это определяет то, что мы подразумеваем под «частично-целой иерархией». Причина, по которой мы заботимся о meronomy, заключается в том, что мы должны избегать утечек памяти в наших проектах — Утечки памяти должны быть в прошлом с автоматическим управлением памятью Java. К сожалению, они все еще случаются, когда мы игнорируем meronomy.
После нашего подробного введения мы начнем с простых шаблонов, которые встречаются повсюду. Шаблоны, такие как Стратегия, Итератор, Прокси и Абстрактный класс.
Большинство курсов и книг начинается с шаблонов создания Singleton и Factory Method. Мысль в том, что это очень простые шаблоны. Большинство курсов ошибаются, так как код может сломаться в работе.
Мы учимся больше, делая, а не слушая. Каждый шаблон сопровождается упражнениями, которые мы решаем, чтобы улучшить наше понимание шаблона. Для каждого упражнения у нас есть типовые решения и подробное пошаговое руководство, где я покажу вам процесс мышления при решении упражнения. Некоторые из упражнений сложны. Другие проще.
ООП и паттерны проектирования
Данная рубрика целиком и полностью посвящена вопросам объектно-ориентированного программирования в Java и паттернам проектирования.
2015-12-21
ООП и паттерны проектирования
Каталог с описанием паттернов проектирования и ссылками на статьи блога Javenue с примерами программного кода на Java.
2015-12-15
ООП и паттерны проектирования
Еще одна статья о паттернах проектирования в Java. На этот раз рассмотрен Паттерн Iterator и приведен пример его реализации.
2009-03-22
ООП и паттерны проектирования
В статье рассказывается об исследовании количества потоков необходимых для обработки запросов в веб-приложении на Jetty.
2008-03-27
ООП и паттерны проектирования
Паттерн Observer был придуман для наблюдения за состоянием объектов в системе и оповещения других частей системы об изменениях.
2008-01-19
ООП и паттерны проектирования
В статье рассматривается отличный от использования интерфейса Cloneable способ реализации Паттерна Prototype на языке Java.
2007-05-21
ООП и паттерны проектирования
Структурный паттерн Adapter бывает двух видов — Object и Class адаптеры. В статье вы найдете диаграммы и примеры реализации шаблона.
2007-01-13
ООП и паттерны проектирования
Паттерн Builder отделят процесс создания объектов от его представления. Ниже вы найдете пример реализации этого шаблона проектирования на Java.
2006-11-20
ООП и паттерны проектирования
Читайте про такие анти-паттерны проектирования в Java, как внесенная сложность (introduced complexity) и мягкое кодирование (soft code)
2006-08-26
ООП и паттерны проектирования
Автор описывает опыт участия в соревнованиях по объектно-ориентированному проектированию с использованием UML и написанию спецификаций.
2006-02-28
ООП и паттерны проектирования
Popular design pattern Singleton explained: description along with the example of its practical implementation during Java programming.
Книга «Java EE. Паттерны проектирования для профессионалов»
У нас вышла книга Мурата Йенера и Алекса Фидома.
Книга «Java EE. Паттерны проектирования для профессионалов» — незаменимый ресурс для всех, кто желает более эффективно работать с Java EE, а также единственная книга, в которой рассмотрены как теория, так и практика использования паттернов проектирования на примерах реальных прикладных задач.
Авторы знакомят читателя и с фундаментальными, и с наиболее передовыми возможностями Java EE 7, досконально рассматривают каждый из паттернов и демонстрируют, как эти паттерны применяются при решении повседневных прикладных задач.
В этом издании рассматриваются классические паттерны проектирования, впервые упомянутые в знаменитой книге, написанной GoF1, с учетом модернизации их применительно к платформам Java EE 6 и 7.
В каждой главе мы описываем традиционную реализацию паттерна и затем показываем, как реализовать его, используя ориентированную на платформу Java EE семантику.
Мы используем полные примеры кода для демонстрации как традиционной реализации, так и реализации под платформу Java EE, и дополняем каждую главу примерами из практики, демонстрирующими правильное (и ошибочное) применение паттернов. Мы исследуем «за» и «против» каждого паттерна и изучаем области их применения. В конце каждой главы приведены упражнения для проверки степени вашего понимания данного паттерна в Java EE.
Для кого предназначена эта книга
Эта книга — для всех, вне зависимости от уровня опыта. Она охватывает почти всю информацию о паттернах, начиная с того, как их описывают в других книгах, до кода простой реализации на языке Java, реализации на платформе Java EE и, наконец, до примеров из практики: как и когда использовать конкретный паттерн. В ней также есть истории из реальной жизни, в которых обсуждаются удачные и неудачные практики применения паттернов.
Полезным при прочтении книги будет наличие базовых знаний паттернов проектирования и платформы Java EE. Если вы уже имели дело с паттернами и базовыми реализациями на языке Java, то можете перейти сразу к реализациям для Java EE. Впрочем, может оказаться полезным освежить вашу память и знания паттернов проектирования.
Что охватывает эта книга
Эта книга охватывает все классические паттерны проектирования, предлагаемые платформой Java EE в качестве части стандартной реализации, а также некоторые новые паттерны. Охват начинается с Java EE 5 и включает последнюю из доступных на настоящий момент версий платформы — Java EE 7. Мы надеемся, что это издание станет справочником, который надолго поселится на вашей книжной полке.
Как эта книга структурирована
Каждая глава сконцентрирована на одном паттерне проектирования. Если паттерн классический, то после объяснения его сущности дается простая реализация на языке Java. Каждая глава предлагает истории из практики, иллюстрирующие паттерн, на котором сконцентрирована глава, положительными или отрицательными примерами из реальной жизни. За историей из практики следует реализация на платформе Java EE, пример и объяснение. Каждый пример кода может быть запущен отдельно от других. Наконец, каждая глава завершается описанием того, где и как эффективно использовать этот паттерн.
Об авторах
Мурат Йенер — фанатик программирования и коммитер открытого программного обеспечения; в данный момент разработчик под платформу Android в подразделении Intel New Devices Group. Он обладает обширным опытом разработки приложений на языке Java, веб-фреймворков, приложений для платформы Java EE и модульных приложений на основе спецификации OSGi. Кроме того, он занимается созданием учебных курсов и преподает. Мурат — коммитер свободной среды разработки Eclipse и один из первых коммитеров проекта Eclipse Libra. Сейчас он разрабатывает нативные и гибридные мобильные приложения с применением языка HTML5 и фреймворка mGWT.
Мурат был руководителем пользовательской группы конференции GDC в Стамбуле с 2009 года, организуя там различные мероприятия, участвуя и выступая в них. Он также регулярно выступает на конференциях JavOne, EclipseCon и Devoxx.
Linkedin — www.linkedin.com/in/muratyener.
Twitter — @yenerm.
Blog — www.devchronicles.com.
Алекс Сидом — ведущий Java-разработчик в Indigo Code Collective indigocodecollective.com (подразделение E-scape Group), где он играет ключевую роль в создании архитектурного дизайна и разработке основанной на микросервисе, созданной на заказ лотереи и платформы мгновенных лотерей.
До этого он разрабатывал программное обеспечение для банкоматов международного испанского банка и программное обеспечение для анализа качества кода для ИТ-консалтинга. Алекс обладает опытом разработки веб-приложений на языке Java для различных сфер деятельности, включая финансовое дело, электронное обучение, лотереи и разработку программного обеспечения. Страсть к разработке приводила его в проекты по всей Европе и за ее пределами. Он ведет блог на alextheedom.com и помогает коллегам в решении проблем на онлайн-форумах.
Linkedin — www.linkedin.com/in/alextheedom.
Twitter — @alextheedom.
Blog — www.alextheedom.com.
О техническом редакторе
Мухаммед Санаулла — разработчик программного обеспечения с более чем пятилетним опытом разработки. В настоящее время работает на крупнейшее индийское предприятие в сфере электронной коммерции, а также является модератором на форуме JavaRanch. В свободное от работы время он присматривает за своей прелестной маленькой дочкой. Своими экспериментами и мыслями на тему разработки программного обеспечения он делится по адресу http://blog.sanaulla.info/.
Более подробно с книгой можно познакомиться на сайте издательства
Оглавление
Отрывок
Для Хаброжителей скидка 25% по купону — Java EE.
В электронном виде книга не продается, по факту оплаты бумажной книги, на e-mail придет pdf и epub книга Энтони Гонсалвелса «Изучаем Java EE 7».
Что такое паттерн проектирования MVC в Java?
В паттерне «Модель — представление — контроллер» модель представляет данные приложения и связанную с ними бизнес-логику. Модель может быть представлена одним объектом или сложным графом связанных объектов. В приложении для платформы Java ЕЕ данные инкапсулируются в объектах предметной области, часто развертываемых в EJB-модуле. Данные передаются в БД и из нее в объектах передачи данных (ОТО), и к ним обращаются с помощью объектов доступа к данным (ОАО).
Представление — это наглядное отображение содержащихся в модели данных.Подмножество модели содержится в отдельном представлении, таким образом, представление действует в качества фильтра для данных модели. Пользователь взаимодействует с данными модели с помощью предлагаемого представлением наглядного отображения и обращается к бизнес логике, которая, в свою очередь, воздействует на данные модели.
Контроллер связывает представление с моделью и управляет потоками данных приложения. Он выбирает, какое представление визуализировать для пользователя в ответ на вводимые им данные и в соответствии с выполняемой бизнес-логикой. Контроллер получает сообщение от представления и пересылает его модели. Модель, в свою очередь, подготавливает ответ и отправляет ero обратно контроллеру, где происходит выбор представления и отправка ero пользователю.
Паттерн MVC логически охватывает клиента и промежуточный уровень многоуровневой архитектуры. В среде Java ЕЕ модель располагается в бизнес-слое, обычно в виде ЕJВ-модуля.
Контроллер и представление расположены на веб-уровне. Представление, вероятнее всего, будет создано из JavaServer Faces(JSF) или JavaServer Pages(JSP) с помощью языка выражений (EL). Контроллер обычно представляет собой сервлет, получающий НТТР-запросы от пользователя.
Часто MVC сочетается с другими паттернами, такими как «Команда» (или «Действие»), «Стратегия», «Компоновщик» и «Наблюдатель».
Впервые этот паттерн упоминался еще до создания Интернета в современном виде, в статье, опубликованной в декабре 1979 года работавшим тогда в компании Xeror SmallTalk-программистом Трюгве Реенскауг.
И хотя элементы MVC этого паттерна были описаны более 35 лет назад, они удивительно точно соответствуют современному их использованию в веб-приложениях.
Следующий рисунок показывает пользователя, выполняющего запрос к контроллеру. Контроллер обрабатывает запрос путем обновления модели и визуализации нового представления, которое затем отправляется пользователю.
Диаграмма паттерна MVC
Паттерн MVC существует в множестве разных форм. Две наиболее известные обычно называются тип I и тип II.
Типы паттерна MVC:
- MVC тип I. Этот тип представляет собой странично-ориентированный подход,при котором представление и контроллер существуют в виде одной сущности, именуемой «представление — контроллер». При этом подходе логика контроллера реализуется в представлении, таком кaк JSF. Все выполняемые контроллером задания, включая извлечение атрибутов и параметров НТТР-запроса, вызов бизнес-логики и управление НТТР-сеансом, встроены в представление с помощью скриптлетов и библиотек тегов. Тип I сильно связывает формирование представления с последовательностью выполняемых приложением действий, затрудняя тем самым сопровождение.
- MVC тип II. Проблемы с сопровождением в типе I преодолены в типе II благодаря вынесению логики контроллера из представления в сервлет, при этом визуализация данных остается представлению.
Главное различие между типом I и типом II — в местонахождении логики контроллера: в типе I она в представлении, а в типе II — в сервлете.
Многие фреймворки, такие как Spring MVC, Struts, Grails и Wicket, реализуют свою собственную версию паттерна MVC типа II. Например, Spring MVC включает концепцию сервлета-диспетчера, взаимодействующего с НТТР-запросами и выполняющего делегирование контроллеру, а также содержит представление (и преобразователь представления) и обработчики.
Следующий рисунок демонстрирует диаграмму реализации паттерна MVC в Spring.
Диаграмма реализации паттерна MVC в Spring
Java Design Patterns — Example Tutorial
Design Patterns очень популярны среди разработчиков программного обеспечения. Шаблон проектирования — это хорошо описанное решение типичной проблемы программного обеспечения. Я много писал о шаблонах проектирования Java . Вы можете скачать электронную книгу в формате PDF (более 130 страниц), подписавшись на нашу рассылку новостей.
Шаблоны проектирования Java
Некоторые из преимуществ использования шаблонов проектирования:
- Шаблоны проектирования уже определены и обеспечивают стандартный отраслевой подход для решения повторяющейся проблемы, поэтому разумное использование шаблона проектирования экономит время.Есть много шаблонов проектирования Java, которые мы можем использовать в наших проектах на основе Java.
- Использование шаблонов проектирования способствует повторному использованию , что приводит к более надежному и легко обслуживаемому коду. Это помогает снизить совокупную стоимость владения (TCO) программного продукта.
- Поскольку шаблоны проектирования уже определены, это упрощает понимание и отладку нашего кода. Это приводит к более быстрому развитию, и новые члены команды легко это понимают.
Шаблоны проектирования Java делятся на три категории: творческих , структурных и поведенческих шаблонов проектирования.Этот пост служит указателем для всех статей о шаблонах проектирования java, которые я написал до сих пор.
Видеоуроки по шаблонам дизайна
Недавно я запустил видеоуроки по шаблонам дизайна, и они загружены на YouTube. Подпишитесь на мой канал YouTube, так как я планирую загрузить гораздо больше видео о Core Java, Spring Framework и т. Д.
Шаблоны проектирования для творчества
Шаблоны проектирования для создания объектов предоставляют решение для наилучшего создания экземпляра объекта для конкретных ситуаций.
1. Шаблон Singleton
Шаблон Singleton ограничивает создание экземпляра класса и гарантирует, что на виртуальной машине Java существует только один экземпляр класса. Это кажется очень простым шаблоном проектирования, но когда дело доходит до реализации, возникает множество проблем с реализацией. Реализация шаблона Singleton всегда была спорной темой среди разработчиков. Ознакомьтесь с Шаблон проектирования Singleton , чтобы узнать о различных способах реализации шаблона Singleton, а также о плюсах и минусах каждого метода.Это один из наиболее обсуждаемых шаблонов проектирования Java.
2. Заводской шаблон
Заводской шаблон проектирования используется, когда у нас есть суперкласс с несколькими подклассами, и на основе ввода нам необходимо вернуть один из подклассов. Этот шаблон берет на себя ответственность за создание экземпляра класса из клиентской программы в фабричный класс. Мы можем применить шаблон Singleton к классу Factory или сделать метод factory статическим. Ознакомьтесь с Factory Design Pattern , чтобы узнать о преимуществах программы и заводских шаблонов.Это один из наиболее широко используемых шаблонов проектирования Java.
3. Шаблон абстрактной фабрики
Шаблон абстрактной фабрики похож на образец фабрики и представляет собой фабрику фабрик. Если вы знакомы с шаблоном проектирования factory в java, вы заметите, что у нас есть один класс Factory, который возвращает различные подклассы на основе предоставленных входных данных, а класс factory использует для этого операторы if-else или switch.
В шаблоне «Абстрактная фабрика» мы избавляемся от блока if-else и имеем класс фабрики для каждого подкласса, а затем класс абстрактной фабрики, который будет возвращать подкласс на основе входного класса фабрики.Ознакомьтесь с Abstract Factory Pattern , чтобы узнать, как реализовать этот шаблон с помощью примера программы.
4. Шаблон Builder
Этот шаблон был введен для решения некоторых проблем с шаблонами проектирования Factory и Abstract Factory, когда объект содержит множество атрибутов. Шаблон Builder решает проблему с большим количеством необязательных параметров и несогласованным состоянием, предоставляя способ построения объекта шаг за шагом и предоставляя метод, который фактически вернет окончательный объект.Ознакомьтесь с Builder Pattern для примера программы и классов, используемых в JDK. <
5. Prototype Pattern
Шаблон прототипа используется, когда создание объекта является дорогостоящим делом и требует много времени и ресурсов, и у вас есть подобный объект уже существует. Таким образом, этот шаблон предоставляет механизм для копирования исходного объекта в новый объект и последующего изменения его в соответствии с нашими потребностями. Этот шаблон использует клонирование java для копирования объекта.
Шаблон проектирования прототипа требует, чтобы объект, который вы копируете, предоставлял функцию копирования.Никакой другой класс не должен этого делать. Однако, использовать ли частичную или глубокую копию свойств объекта, зависит от требований и это дизайнерское решение. См. Образец программы Prototype Pattern .
Структурные шаблоны проектирования
Структурные шаблоны предоставляют различные способы создания структуры классов, например, с использованием наследования и композиции для создания большого объекта из небольших объектов.
1. Шаблон адаптера
Шаблон проектирования адаптера — это один из структурных шаблонов проектирования, который используется для совместной работы двух несвязанных интерфейсов.Объект, который присоединяется к этим несвязанным интерфейсам, называется адаптером. В качестве примера из реальной жизни мы можем рассматривать мобильное зарядное устройство как адаптер, потому что для зарядки мобильной батарее требуется 3 вольта, а обычная розетка выдает либо 120 В (США), либо 240 В (Индия). Таким образом, мобильное зарядное устройство работает как адаптер между мобильной зарядной розеткой и сетевой розеткой. Посмотрите Adapter Pattern , например, программу и ее использование в Java.
2. Составной шаблон
Составной шаблон — это один из структурных шаблонов проектирования, который используется, когда мы должны представить иерархию «часть-целое».Когда нам нужно создать структуру таким образом, чтобы объекты в структуре обрабатывались одинаково, мы можем применить шаблон составного проектирования.
Давайте разберемся с этим на реальном примере. Диаграмма — это структура, состоящая из таких объектов, как круг, линии, треугольник и т. Д., И когда мы заполняем рисунок цветом (например, красным), тот же цвет применяется к Объекты на чертеже. Здесь рисунок состоит из разных частей, и все они выполняются одинаково. Ознакомьтесь со статьей Composite Pattern , чтобы узнать о различных компонентах составного шаблона и программе-примере.
3. Шаблон прокси
Шаблон прокси предназначен для «предоставления суррогата или заполнителя для другого объекта для управления доступом к нему». Само определение очень четкое, и шаблон прокси используется, когда мы хотим обеспечить контролируемый доступ к функциональности.
Допустим, у нас есть класс, который может выполнять некоторую команду в системе. Теперь, если мы его используем, это нормально, но если мы хотим передать эту программу клиентскому приложению, у него могут быть серьезные проблемы, потому что клиентская программа может выдать команду на удаление некоторых системных файлов или изменение некоторых параметров, которые вам не нужны. .Ознакомьтесь с публикацией Proxy Pattern для примера программы с деталями реализации.
4. Шаблон проектирования «Легковес»
Шаблон проектирования «Легковес» используется, когда нам нужно создать множество объектов класса. Поскольку каждый объект потребляет пространство памяти, которое может иметь решающее значение для устройств с низким объемом памяти, таких как мобильные устройства или встроенные системы, можно применить легковесный шаблон проектирования для уменьшения нагрузки на память путем совместного использования объектов. Реализация String Pool в java — один из лучших примеров реализации паттерна Flyweight.Ознакомьтесь со статьей Flyweight Pattern для ознакомления с программой и процессом ее реализации.
5. Образец фасада
Образец фасада используется, чтобы помочь клиентским приложениям легко взаимодействовать с системой. Предположим, у нас есть приложение с набором интерфейсов для использования базы данных MySql / Oracle и создания различных типов отчетов, таких как HTML-отчет, PDF-отчет и т. Д. Таким образом, у нас будет другой набор интерфейсов для работы с разными типами баз данных. . Теперь клиентское приложение может использовать эти интерфейсы для получения необходимого соединения с базой данных и создания отчетов.Но когда сложность возрастает или названия поведения интерфейса сбивают с толку, клиентскому приложению становится трудно управлять им. Таким образом, мы можем применить здесь шаблон фасада и предоставить интерфейс-оболочку поверх существующего интерфейса, чтобы помочь клиентскому приложению. Ознакомьтесь с публикацией Facade Pattern , чтобы узнать подробности реализации и образец программы.
6. Шаблон моста
Когда у нас есть иерархии интерфейсов как в интерфейсах, так и в реализациях, тогда шаблон проектирования моста используется для отделения интерфейсов от реализации и сокрытия деталей реализации от клиентских программ.Как и шаблон «Адаптер», это один из шаблонов структурного проектирования.
Реализация шаблона проектирования моста следует идее предпочтения композиции перед наследованием. Ознакомьтесь с публикацией Bridge Pattern для получения подробностей о реализации и примера программы.
7. Шаблон декоратора
Шаблон проектирования декоратор используется для изменения функциональности объекта во время выполнения. В то же время другие экземпляры того же класса не будут затронуты этим, поэтому индивидуальный объект получит измененное поведение.Шаблон проектирования декоратора является одним из структурных шаблонов проектирования (таких как шаблон адаптера, шаблон моста, составной шаблон) и использует абстрактные классы или интерфейс с композицией для реализации.
Мы используем наследование или композицию для расширения поведения объекта, но это делается во время компиляции и применимо ко всем экземплярам класса. Мы не можем добавить какие-либо новые функции, чтобы удалить любое существующее поведение во время выполнения — это когда шаблон Decorator появляется на картинке.Ознакомьтесь с публикацией Decorator Pattern для получения примеров программы и деталей реализации.
Поведенческие шаблоны проектирования
Поведенческие шаблоны предоставляют решение для лучшего взаимодействия между объектами и того, как обеспечить потерю связи и гибкость для простого расширения.
1. Шаблон метода шаблона
Метод шаблона — это шаблон поведенческого проектирования, который используется для создания заглушки метода и откладывания некоторых этапов реализации на подклассы.Шаблонный метод определяет шаги для выполнения алгоритма и может предоставить реализацию по умолчанию, которая может быть общей для всех или некоторых подклассов.
Предположим, мы хотим предоставить алгоритм для строительства дома. Шаги, которые необходимо выполнить, чтобы построить дом, — это строительство фундамента, строительных столбов, стен здания и окон. Важным моментом является то, что мы не можем изменить порядок выполнения, потому что мы не можем строить окна до строительства фундамента. Итак, в этом случае мы можем создать метод шаблона, который будет использовать разные методы для построения дома.Ознакомьтесь с публикацией Template Method Pattern для подробностей реализации с примером программы.
2. Шаблон посредника
Шаблон проектирования посредника используется для обеспечения централизованной среды связи между различными объектами в системе. Шаблон проектирования посредника очень полезен в корпоративном приложении, где несколько объектов взаимодействуют друг с другом. Если объекты взаимодействуют друг с другом напрямую, компоненты системы тесно связаны друг с другом, что увеличивает стоимость обслуживания и затрудняет легкое расширение.Шаблон посредника предназначен для обеспечения посредника между объектами для связи и помощи в реализации потери связи между объектами.
Диспетчер управления воздушным движением — отличный пример схемы посредника, в которой диспетчерская аэропорта работает как посредник для связи между различными рейсами. Посредник работает как маршрутизатор между объектами и может иметь собственную логику, обеспечивающую способ связи. Ознакомьтесь с публикацией Mediator Pattern для получения подробной информации о реализации с примером программы.
3. Шаблон цепочки ответственности
Шаблон цепочки ответственности используется для достижения слабой связи в разработке программного обеспечения, когда запрос от клиента передается цепочке объектов для их обработки. Затем объект в цепочке решит, кто будет обрабатывать запрос и нужно ли отправлять запрос следующему объекту в цепочке или нет.
Мы знаем, что в коде блока try-catch может быть несколько блоков catch. Здесь каждый блок catch является своего рода процессором для обработки этого конкретного исключения.Поэтому, когда исключение возникает в блоке try, оно отправляется для обработки в первый блок catch. Если блок catch не может его обработать, он перенаправляет запрос следующему объекту в цепочке, то есть следующему блоку catch. Если даже последний блок catch не может его обработать, исключение выдается за пределы цепочки в вызывающую программу.
Логика выдачи банкоматов
может быть реализована с использованием шаблона цепочки ответственности , см. Связанный пост.
4. Шаблон наблюдателя
Шаблон проектирования наблюдателя полезен, когда вас интересует состояние объекта и вы хотите получать уведомления о любых изменениях.В шаблоне наблюдателя объект, который наблюдает за состоянием другого объекта, называется Observer , а объект, за которым наблюдают, называется Subject .
Java предоставляет встроенную платформу для реализации шаблона Observer через класс java.util.Observable и интерфейс java.util.Observer. Однако он широко не используется, потому что реализация действительно проста, и большую часть времени мы не хотим в конечном итоге расширять класс только для реализации шаблона Observer, поскольку java не предоставляет множественное наследование в классах.
Служба сообщений Java (JMS) использует шаблон наблюдателя вместе с шаблоном посредника, чтобы позволить приложениям подписываться и публиковать данные в других приложениях. Ознакомьтесь с публикацией Observer Pattern для получения подробной информации о реализации и примера программы.
5. Шаблон стратегии
Шаблон стратегии используется, когда у нас есть несколько алгоритмов для конкретной задачи, и клиент решает, что фактическая реализация будет использоваться во время выполнения.
Шаблон стратегии также известен как шаблон политики.Мы определяем несколько алгоритмов и позволяем клиентским приложениям передавать алгоритм, который будет использоваться в качестве параметра. Один из лучших примеров этого шаблона — метод Collections.sort (), который принимает параметр Comparator. Основываясь на различных реализациях интерфейсов Comparator, объекты сортируются по-разному.
Ознакомьтесь с публикацией Strategy Pattern , чтобы узнать подробности реализации и пример программы.
6. Шаблон команды
Шаблон команды используется для реализации потери связи в модели запрос-ответ.В шаблоне команды запрос отправляется вызывающей стороне, и вызывающая программа передает его инкапсулированному объекту command . Объект команды передает запрос соответствующему методу приемника для выполнения определенного действия.
Допустим, мы хотим предоставить утилиту файловой системы с методами открытия, записи и закрытия файла, и она должна поддерживать несколько операционных систем, таких как Windows и Unix.
Для реализации нашей утилиты File System, прежде всего, нам нужно создать классы-получатели, которые фактически будут выполнять всю работу.Поскольку мы кодируем в терминах интерфейсов Java, у нас может быть интерфейс FileSystemReceiver и его классы реализации для различных версий операционных систем, таких как Windows, Unix, Solaris и т. Д. Ознакомьтесь с публикацией Command Pattern для получения подробностей реализации с примером программы.
7. Шаблон состояния
Шаблон проектирования состояния используется, когда Объект изменяет свое поведение на основе его внутреннего состояния.
Если нам нужно изменить поведение объекта на основе его состояния, мы можем иметь переменную состояния в объекте и использовать блок условия if-else для выполнения различных действий на основе состояния.Шаблон состояния используется для обеспечения систематического и слабосвязанного способа достижения этого посредством реализаций контекста и состояния.
Ознакомьтесь с публикацией State Pattern для получения подробной информации о реализации с примером программы.
8. Шаблон посетителя
Шаблон посетителя используется, когда нам нужно выполнить операцию над группой объектов схожих типов. С помощью шаблона посетителя мы можем перенести операционную логику с объектов в другой класс.
Например, представьте себе корзину для покупок, в которую мы можем добавить различные типы товаров (элементы). Когда мы нажимаем кнопку оформления заказа, она вычисляет общую сумму, подлежащую оплате.Теперь у нас может быть логика расчета в классах элементов или мы можем переместить эту логику в другой класс, используя шаблон посетителя. Давайте реализуем это на нашем примере шаблона посетителя. Ознакомьтесь с публикацией Visitor Pattern для подробностей реализации.
9. Шаблон интерпретатора
используется для определения грамматического представления языка и предоставляет интерпретатор для работы с этой грамматикой.
Лучшим примером этого шаблона является компилятор Java, который интерпретирует исходный код Java в байтовый код, понятный JVM.Google Translator также является примером шаблона интерпретатора, в котором ввод может быть на любом языке, и мы можем интерпретировать вывод на другом языке.
Посмотрите сообщение Interpreter Pattern для примера программы.
10. Шаблон итератора
Шаблон итератора в одном из поведенческих шаблонов, который используется для предоставления стандартного способа перехода через группу объектов. Шаблон Iterator широко используется в Java Collection Framework, где интерфейс Iterator предоставляет методы для обхода коллекции.
Шаблон итератора предназначен не только для обхода коллекции, но мы также можем предоставить различные виды итераторов в зависимости от наших требований. Шаблон итератора скрывает фактическую реализацию обхода через коллекцию, а клиентские программы просто используют методы итератора. Ознакомьтесь с публикацией Iterator Pattern , где приведены примеры программ и деталей реализации.
11. Шаблон Memento
Шаблон проектирования Memento используется, когда мы хотим сохранить состояние объекта, чтобы мы могли восстановить его позже.Шаблон Memento используется для реализации этого таким образом, что сохраненные данные состояния объекта недоступны за пределами объекта, это защищает целостность сохраненных данных состояния.
Паттерн Memento реализован с двумя объектами — Originator и Caretaker. Создателем является объект, состояние которого необходимо сохранить и восстановить, и он использует внутренний класс для сохранения состояния объекта. Внутренний класс называется Memento и является частным, поэтому к нему нельзя получить доступ из других объектов.
Ознакомьтесь с Memento Pattern , чтобы получить образец программы и подробности реализации.
Разные шаблоны проектирования
Существует множество шаблонов проектирования, которые не входят в состав шаблонов проектирования GoF. Давайте посмотрим на некоторые из этих популярных шаблонов проектирования.
1. Шаблон проектирования DAO
Шаблон проектирования DAO используется для разделения логики сохранения данных на отдельный уровень. DAO — очень популярный паттерн, когда мы проектируем системы для работы с базами данных.Идея состоит в том, чтобы держать уровень сервиса отдельно от уровня доступа к данным. Таким образом мы реализуем разделение логики в нашем приложении.
Checkout DAO Pattern для получения полной информации и примера программы.
2. Шаблон внедрения зависимостей
Внедрение зависимостей позволяет нам удалить жестко запрограммированные зависимости и сделать наше приложение слабосвязанным, расширяемым и поддерживаемым. Мы можем реализовать внедрение зависимостей в java, чтобы переместить разрешение зависимостей из времени компиляции во время выполнения.Фреймворк Spring построен по принципу внедрения зависимостей.
Узнайте больше о шаблоне внедрения зависимостей, чтобы понять, как реализовать его в нашем приложении Java.
3. Шаблон MVC
Шаблон MVC — один из старейших архитектурных шаблонов для создания веб-приложений. MVC расшифровывается как Model-View-Controller.
Checkout MVC Pattern для получения дополнительных сведений и полного примера кода.
Это все для различных шаблонов проектирования в Java. Цель этого поста — предоставить указатель для удобного просмотра всех из них.
.
шаблонов проектирования в Java
Что такое шаблоны дизайна?
Шаблоны проектирования — это просто наборы стандартизированных практик, используемых в индустрии разработки программного обеспечения. Они представляют собой решения, предоставляемые сообществом, для общих проблем, с которыми сталкиваются повседневные задачи, связанные с разработкой программного обеспечения.
Существует множество шаблонов проектирования, и вы, вероятно, уже знакомы с некоторыми из них. Если вы будете с ними знакомы и будете знать их наизусть, это поможет вам повысить скорость и качество вашего развития.
Используя уже четко определенные подходы вместо изобретения колеса, а также хорошо известные отраслевые стандарты, вы помогаете своей команде и себе создавать высококачественные приложения, которые легче поддерживать и улучшать.
Еще один важный момент, о котором стоит упомянуть, — это единообразие и универсальность. Вместо того, чтобы объяснять общую концепцию кому-то еще, вы можете просто сказать им использовать определенный шаблон.
Большинство этих шаблонов применимы к нескольким языкам, не только к Java, но некоторые, например J2EE Design Patterns , применимы в основном к Java или, скорее, Java EE.
Существует три основных категории шаблонов проектирования: Creational Patterns , Structural Patterns и Behavioral Patterns , но мы также погрузимся в J2EE Patterns .
Шаблоны создания , как следует из названия, больше всего заботятся о решениях и вариантах, связанных с созданием экземпляров объектов, и о том, как сделать это более эффективно в самых различных обстоятельствах.
Структурные образцы заботятся о предоставлении решений и эффективных стандартов, касающихся составов классов и структур объектов.Кроме того, они полагаются на концепцию наследования и интерфейсов, позволяющую нескольким объектам или классам работать вместе и формировать единое рабочее целое.
Поведенческие шаблоны заботятся о предоставлении решений, касающихся взаимодействия объектов — как они взаимодействуют, как некоторые из них зависят от других, и как разделить их, чтобы они были зависимыми и независимыми, а также обеспечивали гибкость и возможности тестирования.
Шаблоны J2EE предназначены для предоставления решений, касающихся Java EE.Эти шаблоны широко применяются в других фреймворках и проектах, например в Spring.
Шаблоны проектирования в Java
На это имя мы составили список всех шаблонов дизайна, с которыми вы столкнетесь или будете использовать в качестве разработчика программного обеспечения, реализованных на Java.
Шаблоны создания
Структурные образцы
Поведенческие модели
Паттерны J2EE
.Введение в шаблон проектирования
— Шаблоны проектирования Java
Шаблон проектирования — это общее решение многократного использования для часто встречающейся проблемы в заданном контексте разработки программного обеспечения.
Шаблон проектирования — это не законченный проект, который можно преобразовать непосредственно в исходный или машинный код. Это описание или шаблон
о том, как решить проблему, который можно использовать в самых разных ситуациях. Шаблоны — это формализованные передовые практики, которые программист должен
реализовать в приложении. Паттерны объектно-ориентированного проектирования обычно показывают отношения и взаимодействия между классами или объектами,
без указания конечных классов приложения или задействованных объектов.Паттерны, предполагающие объектную ориентацию или в более общем смысле
изменяемое состояние, неприменимы в языках функционального программирования.
Типы шаблонов проектирования: творческие, структурные и поведенческие.
Шаблон создания дизайна
Шаблоны проектирования создания — это шаблоны проектирования, которые имеют дело с механизмами создания объектов, пытаясь создать объекты определенным образом.
подходит к ситуации. Базовая форма создания объекта может привести к проблемам при проектировании или к усложнению конструкции.Творческий
шаблоны проектирования решают эту проблему, каким-то образом управляя созданием этого объекта. Типы шаблонов творческого проектирования:
- Одиночный образец
- Заводской образец
- Абстрактный узор фабрики
- Выкройка строителя
- Выкройка прототипа
Структурный образец проектирования
Структурные шаблоны проектирования — это шаблоны проектирования, которые упрощают проектирование, определяя простой способ реализации взаимосвязей между сущностями.
- Шаблон адаптера
- Составной узор
- Шаблон прокси
- Наилегчайший образец
- Фасадный узор
- Образец моста
- Узор-декоратор
Поведенческий шаблон дизайна
Поведенческие шаблоны проектирования — это шаблоны проектирования, которые определяют общие шаблоны взаимодействия между объектами и реализуют
эти шаблоны. Поступая таким образом, эти паттерны увеличивают гибкость в проведении этого общения.
- Шаблон метода Шаблон
- Шаблон посредника
- Схема цепочки ответственности
- Схема наблюдателя
- Паттерн стратегии
- Командный шаблон
- Государственный образец
- Шаблон посетителей
- Шаблон итератора
- Узор на память
.
шаблонов проектирования для начинающих с примерами Java
В этом руководстве мы познакомим вас с миром шаблонов проектирования. Для каждого шаблона мы дополнительно понимаем шаблон и контекст, в котором он применим, на реальных примерах.
Из этого поста вы узнаете:
- Что такое шаблоны проектирования
- Почему мы используем шаблоны проектирования
- Различные типы шаблонов проектирования
- Когда мы используем шаблоны проектирования
- Как реализовать различные шаблоны проектирования в Java
- Реальные примеры шаблонов проектирования.
Что такое шаблоны дизайна?
Мы создаем объектно-ориентированное программное обеспечение более 40 лет, начиная с Smalltalk, который был первым объектно-ориентированным языком.
Мир программирования столкнулся с большим количеством проблем, и были предложены различные решения для их решения.
Группа из четырех человек, известная как «Банда четырех» или GoF, была предпринята попытка придумать для них набор общих проблем и решений в данном контексте.
Этот каталог общих проблем и способов их решения обозначен как GOF (Gang of Four) Design Patterns.
Почему шаблоны проектирования?
Преимущества шаблонов проектирования:
- Для предоставления стандартной терминологии, понятной всем
- Не повторять одни и те же ошибки снова и снова
Какие типы шаблонов проектирования?
Паттерны проектирования, о которых мы здесь говорим, взяты с точки зрения объектно-ориентированного мира.В основном существует три различных типа шаблонов проектирования:
- Шаблоны создания
- Структурные образцы
- Поведенческие модели
Творческий
Шаблоны создания имеют дело с созданием объектов.
Строительный
Структурные паттерны связаны с составом объектов.
Он занимается такими вопросами, как:
- Что содержит класс?
- Каковы отношения класса с другими классами? Это наследование или композиция?
Поведенческие
Поведенческие паттерны больше фокусируются на поведении объектов или, точнее, на взаимодействиях между объектами.
Как объект взаимодействует с другим объектом?
Изучение творческих шаблонов дизайна
Мы исследуем следующие шаблоны творческого проектирования:
Образец прототипа
Прототип представляет собой полностью инициализированный экземпляр, который нужно скопировать или клонировать.
Рассмотрим пример:
Давайте рассмотрим схему игры в шахматы. В каждой шахматной партии начальная установка одинакова — король, ферзь, ладья, слон, конь и пешки занимают свои определенные места.Допустим, мы хотим создать программное обеспечение для моделирования шахматной игры.
Каждый раз, когда начинается новая шахматная партия, нам нужно создать начальную раскладку доски.
Вместо того, чтобы каждый раз повторять создание шахматной доски,
- Мы можем создать объект, содержащий начальную настройку
- Клонировать из него — каждый раз, когда начинается новая шахматная партия.
Объект с начальной расстановкой шахматной доски является прототипом. И мы используем шаблон-прототип.
Разве это не просто?
В шаблоне прототипа у вас есть полностью инициализированный экземпляр. Здесь легко доступен исходный макет платы.
Каждый раз, когда начинается новая шахматная игра, например, на любом из многочисленных онлайн-порталов Chess, этот инициализированный экземпляр просто копируется или клонируется.
Выкройка Строителя
Шаблон Builder отделяет конструкцию объекта от его представления. Что это значит?
Предположим, вы идете в ресторан пообедать из нескольких блюд.У такого ужина будет много вариантов, таких как закуски, основное блюдо и десерты. Вероятно, вы выберете два или три из представленных вариантов. Конкретный клиент может захотеть пообедать только с первыми двумя вариантами, исключив вариант десертов. Тем не менее, другой предпочел бы основное блюдо и десерты, полностью пропустив закуски.
Подобные ситуации могут возникнуть при разработке программного обеспечения. Возможно, вам потребуется построить объект, используя подмножество доступных опций.Или вам может потребоваться создать объект несколькими способами. Здесь вам пригодится паттерн-строитель.
Чтобы понять это дальше, давайте рассмотрим небольшой фрагмент кода.
Допустим, вы пишете программное обеспечение для машины, которая готовит кофе. Основные ингредиенты кофе — кофе, молоко и сахар.
В зависимости от того, из какой вы части мира, вы выбираете, есть ли у вас сахар и молоко.
Шаблон Builder предоставляет вам эти варианты кофе.
Посмотрите на код внутри main ()
.
То, что у нас есть внутри Coffee
, — это Builder
, которому мы передаем обязательный тип
кофе. Прикованные к этому призыву, мы делаем другие вызовы, добавляя в свои предпочтения другие ингредиенты.
Кто-то другой, кто хочет другой кофе, может легко его приготовить. Это приводит к огромной гибкости в построении объектов.
Другие подходы к решению этой проблемы, такие как использование сеттеров, имеют много проблем.Эти решения приводят к возникновению кода, который трудно читать, а также к ошибкам в многопоточных программах. Шаблон Builder решает все эти проблемы.
Преимущества использования шаблона компоновщика:
- Упрощает создание объекта
- ведет к более читаемому коду
- Не позволяет изменять значения
Шаблон Singleton
Одноэлементный шаблон — самый известный среди всех шаблонов проектирования.Что делает этот шаблон, очень ясно из его названия — он позволяет использовать только один экземпляр класса на JVM в любой момент времени.
Хорошее сравнение с реальным миром, вероятно, было бы президентом страны.
Однако здесь есть отказ от ответственности — может быть только один экземпляр этого класса, на JVM . Если у вас есть приложение Java, которое работает как часть кластера серверов приложений, каждый сервер запускает отдельный экземпляр JVM. Следовательно, вам разрешено создать один экземпляр синглтона на каждом сервере приложений в любой момент времени.
При создании одноэлементного класса следует помнить о нескольких вещах.
- Конструктор должен быть
частным
, чтобы предотвратить возможность создания экземплярами вашего класса другими объектами. - В Java создайте синглтон, используя
Enum
. - JEE 7 имеет встроенную аннотацию с именем
@Singleton
, а также другие связанные аннотации. - Основным недостатком использования одноэлементного шаблона является то, что результирующий код сложно тестировать.Примите четкое решение относительно того, где вам абсолютно необходимо использовать синглтон, а где нет.
- В таких фреймворках, как Spring, управляемые объекты называются beans, а beans по умолчанию являются одиночными. Что Spring делает хорошо, так это то, что все это остается в фоновом режиме.
Шаблон заводского метода
Целью шаблона фабричного метода является создание семейства типов объектов. Давайте посмотрим на пример кода.
Этот код реализует PersonFactory
.В этом классе есть статический метод с именем getPerson ()
, который принимает в качестве параметров имя и пол человека. В зависимости от переданного пола String
он возвращает либо объект Male
, либо объект Female
.
Если кто-то хочет создать лицо мужского пола, он вызывает метод getPerson ()
в PersonFactory
с аргументом пола «M»
. Точно так же вы можете создать лицо женского пола, вызвав метод getPerson ()
в PersonFactory
с аргументом пола «F»
.
Мы передаем идентификатор типа объекта, который нам нужен во время создания, при этом все еще ссылаясь на общий тип, Person
.
Классы Male
и Female
скрыты за реализацией PersonFactory
.
Преимущество использования шаблона абстрактного метода состоит в том, что вы можете добавлять в фабрику дополнительные типы без значительных изменений в других классах, использующих этот класс. В нашем примере вы можете добавить больше типов пола, не затрагивая существующий код, который имеет дело с другими полами, которые все используют Person
.
А как насчет сложности создания объекта?
Значительно упрощает задачу создания объекта. PersonFactory
принимает решение о том, какой объект создать, и доставляет его нам.
Шаблоны структурного проектирования
Давайте теперь посмотрим на шаблоны структурного проектирования, которые мы хотим изучить.
Шаблон прокси
Прокси-сервер — это объект, представляющий другой объект.
Давайте посмотрим на реальный пример.
Ваша дебетовая карта является прокси для вашего банковского счета. Каждый раз, когда вы совершаете транзакцию с помощью дебетовой карты, соответствующие деньги списываются с банковского счета.
Дебетовая карта — это прокси для вашего банковского счета, который и является фактическим объектом.
Аналогично этому, в программировании вам, возможно, придется программировать взаимодействие с удаленными объектами. В таких ситуациях вы создаете прокси-объект, который заботится обо всех внешних коммуникациях.Вы будете общаться с прокси, как если бы он находился на вашем локальном компьютере.
Хороший пример — домашний и удаленный интерфейсы EJB.
Прокси-сервер скрывает сложность взаимодействия с реальным объектом.
Шаблон декоратора
Шаблон декоратора позволяет нам динамически добавлять обязанности к объектам.
В объектно-ориентированном программировании мы обычно используем наследование.
Пример 1
Допустим, в одной пиццерии есть 10 видов пиццы.В нашей реализации есть 10 классов для этих видов пиццы.
Теперь есть требование, чтобы эти пиццы были доступны с тремя типами начинки. Если мы хотим создать отдельные классы для каждой комбинации пиццы и топпинга, у нас есть всего 30 классов, которыми нужно управлять.
Можем ли мы сделать отношения «пицца сверху» динамичными? Можем ли мы добавить начинку поверх уже готовой пиццы?
Надо использовать топпинг в качестве декоратора любой пиццы.
Пример 2
Другой пример — добавление скидки на заказ пиццы.
Допустим, у вас есть заказ, и по некоторым критериям вы хотите предложить покупателю скидку. В разное время могут действовать различные скидки. Если вы добавляете разные типы скидки к каждому типу заказа, то в статической связи вам необходимо поддерживать сотни классов.
Рассмотрение скидки как декоратора для заказа делает отношения динамичными.
Пример 3
Очень хороший пример реализации шаблона декоратора в Java — это пакеты ввода-вывода Java. Это отражено в том, как мы создаем входной поток в программе ввода-вывода:
У вас есть FileInputStream
. Если вы хотите сделать его буферизованным, добавьте к нему декоратор в виде BufferedInputStream
. Если вы хотите, чтобы буферизованный FileInputStream
дополнительно имел номера строк, добавьте декоратор для LineNumberInputStream
.
Резюме
Шаблон
Decorator позволяет добавлять поведение к существующим объектам во время выполнения. Это позволяет пользователю интерфейса решать, как они хотят создавать объекты.
Недостатком этого подхода является сложность создания объектов. Пользователь должен понимать множество классов и их взаимосвязи, прежде чем сможет использовать возможности декоратора.
Узор фасада
Фасад — это отдельный класс, представляющий всю подсистему.
Давайте возьмем для примера менеджер событий. Организатор мероприятий — это ваш помощник, если вы хотите организовать мероприятие. Они занимаются несколькими аспектами мероприятия, такими как украшения, еда, рассылка приглашений гостям, музыкальные аранжировки и другие подобные вещи. Менеджер событий выступает в роли фасада подсистемы организации мероприятий.
Рассмотрим случай распределенной системы. Обычно вам необходимо несколько вызовов на разных уровнях.
Возьмем, к примеру, систему, которая предлагает услугу онлайн-заказа книг.Когда приходит заказ, необходимо позаботиться о нескольких вещах, таких как проверка наличия на складе, резервирование заказа, принятие платежа, обновление запасов и создание счета-фактуры.
Мы можем создать единый фасад, например интерфейс заказа, который будет управлять всеми входящими заказами и предоставлять интерфейс для клиента.
Преимущество использования паттерна фасада заключается в том, что он уменьшает количество сетевых вызовов, а также уменьшает связь между классами.
Ему удается установить границу транзакции между взаимодействующими объектами.Фасады, как и услуги, являются хорошими центрами для реализации транзакций.
Пока интерфейс фасада остается неизменным, детали реализации подсистемы могут изменяться.
Шаблон адаптера
Адаптер используется для сопоставления интерфейсов разных классов.
Рассмотрим реальный пример адаптеров питания.
Проблема : Если вы покупаете мобильный телефон в Индии, он поставляется с зарядным устройством, которое работает только с электрическими розетками, используемыми в Индии.Если взять такое же зарядное устройство, например, в США, оно не подойдет, так как там не влезет в розетки.
Решение : Решение состоит в том, чтобы использовать дорожный адаптер, который можно использовать с зарядным устройством во время путешествий. Вы можете подключить зарядное устройство к дорожному адаптеру, и дорожный адаптер используется для подключения к розетке в определенной стране.
Точно так же, когда вы пытаетесь поговорить с системой, которая использует другой формат сообщений или другой язык, вам понадобится адаптер для перевода сообщений.
Интересным примером является взаимодействие между программой Java и веб-службой. Перед отправкой данных в службу нам необходимо преобразовать объект в формат XML или JSON. Реализуем шаблон адаптера!
Выкройка наилегчайшего веса
Давайте рассмотрим несколько сценариев
- Создание объекта занимает много времени и включает несколько экземпляров
- Каждый экземпляр объекта занимает много памяти
- Некоторые объекты могут использоваться несколько раз в одном приложении с одинаковыми значениями
В этих сценариях вы, возможно, не захотите создавать новый экземпляр каждый раз, когда это необходимо.
Как насчет кеширования экземпляра и его повторного использования при необходимости?
Легковес представляет собой создание детализированного экземпляра, который используется для эффективного совместного использования.
Пример 1
Действительно хорошим примером из реальной жизни является коммутируемая телефонная сеть общего пользования (PSTN).
В PSTN всегда есть ограниченное количество линий, и для простоты предположим, что это число равно 10. Однако есть тысячи клиентов, которые используют эти линии.Поскольку все 1000 клиентов не будут звонить примерно в одно и то же время, можно эффективно переключать входящие вызовы между существующими 10 линиями.
Пример 2
В мире программного обеспечения хорошим примером шаблона Flyweight являются соединения JDBC.
Пул соединений — это набор соединений с базой данных. Приложение может запускать много запросов, но мы не создаем новое соединение при поступлении нового запроса. Как только запрос поступает, мы сопоставляем его с доступным подключением, и запрос запускается.После выполнения запроса соединение возвращается в пул.
Использование такого инструмента позволяет нам избежать затрат на создание и закрытие соединения.
Шаблоны поведенческого дизайна
Давайте теперь посмотрим на поведенческие шаблоны проектирования.
Модель цепочки ответственности
Шаблон «Цепочка ответственности» представляет собой способ передачи запроса между цепочкой объектов.
Пример 1
Лучший пример этого шаблона можно увидеть в механизме обработки исключений большинства языков программирования.
Предположим, у вас есть method1 ()
, вызывающий method2 ()
, а method2 ()
, в свою очередь, вызывает method3 ()
. Предположим, что method3 ()
вызывает исключение.
Если method3 ()
не имеет обработки исключений, то исключение передается в method2 ()
для его обработки. Если снова method2 ()
не имеет внутри себя обработки исключений, то исключение передается в method1 ()
. Если даже method1 ()
не может его обработать, он также будет исключен из method1 ()
.
Пример 2
Рассмотрим реальный пример процесса утверждения ссуды.
Банковский служащий имеет разрешение утверждать ссуды в пределах определенной суммы. Если сумма превышает указанную, она переходит к контролеру. Надзорный орган установил для него аналогичный, хотя и более крупный лимит одобрения кредита. Если сумма ссуды превышает этот лимит, она переходит к его руководителю и так далее.
Резюме
С шаблоном «Цепочка ответственности» у нас есть цепочка объектов, которые готовы и ждут обработки запросов.Когда новый запрос поступает в систему, он переходит к первому объекту в цепочке для попытки обработки. В зависимости от условий обработки запрос перемещается вверх по цепочке и полностью обрабатывается на каком-то уровне или, возможно, не обрабатывается вообще.
Шаблон итератора
Шаблон Iterator — один из самых простых шаблонов проектирования. У вас есть набор элементов, организованных в коллекцию, и вы хотите последовательно обращаться к этим элементам. Хорошим примером Iterator является пульт от телевизора, на котором есть кнопки «следующий» и «предыдущий» для просмотра телеканалов.Нажатие кнопки «следующий» переводит меня на один канал в прямом направлении, а нажатие кнопки «предыдущий» переводит меня на один канал в обратном направлении.
В работах по программированию примеры класса Iterator
и расширенного цикла для
в Java являются примерами шаблона Iterator.
Государственный образец
Шаблон состояния используется для изменения поведения объекта при изменении его состояния.
Взгляните на этот пример Java:
Рассмотрим пример управления вентиляторной стенкой.Блок управления вентилятором контролирует скорость вращения вентилятора. У него есть уровни скорости от 0 до 5. Когда он находится на уровне 0, вентилятор не вращается, и он вращается быстрее всего на уровне 5.
Когда вы вращаете ручку управления вентилятором, уровень изменяется, и это приводит к изменению скорости вентилятора. Это классический случай изменения состояния (уровня), вызывающего изменение поведения (скорости).
Объект FanwallControl
состоит из объекта SpeedLevel
. SpeedLevel
— это интерфейс, который имеет четыре различных реализации. Первоначально уровень равен , выкл.
, и при нажатии кнопки «Повернуть» в этот момент новая скорость будет на уровне SpeedLevel1
. Это происходит последовательно, и если вы повернетесь на SpeedLevel3
, уровень вернется к Off
.
Если вам нужно определить дополнительный уровень скорости, просто добавьте новый класс, который реализует интерфейс SpeedLevel
и реализует его метод поворота.
Это отличный пример, подчеркивающий преимущества расширяемого класса.
Паттерн стратегии
Задача стратегии — инкапсулировать алгоритм внутри класса. Давайте посмотрим на пример кода Java:
.