Реклама

четверг, 2 июля 2015 г.

Примеры паттернов проектирования в JDK. Часть 3

В третьей части статьи мы поговорим о примерах поведенческих шаблонов проектирования (behavioral patterns) в стандартных классах JDK.
Первая часть статьи здесь, а вторая здесь.


Цепочка ответственности (Chain of responsibility)  - содержит методы, которые вызывают один и тот же метод в каждом экземпляре определенного класса в очереди

    java.util.logging.Logger#log()
    javax.servlet.Filter#doFilter()

Команда (Command) - содержит методы, которые вызывают метод из объекта другого типа, функционал которого  был скрыт реализацией command-метода во время его разработки

    Все реализации  java.lang.Runnable
    Все реализации  javax.swing.Action

Интерпретатор (Interpreter) - содержит методы, которые возвращают разные по структуре экземпляры основываясь на переданном экземпляре; обратите внимание, что парсинг и форматирование не является частью шаблона

    java.util.Pattern
    java.text.Normalizer
    наследники  java.text.Format
    наследники  javax.el.ELResolver

Итератор (Iterator) - содержит методы, которые возвращают объекты из очереди

    Реализации java.util.Iterator
    Реализации java.util.Enumeration

Посредник (Mediator) - обеспечивающий взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга.

    java.util.Timer (все методы scheduleXXX())
    java.util.concurrent.Executor#execute()
    java.util.concurrent.ExecutorService (методы invokeXXX() и submit())
    java.util.concurrent.ScheduledExecutorService (методы scheduleXXX())
    java.lang.reflect.Method#invoke()

Хранитель (Memento) - шаблон, позволяющий, не нарушая инкапсуляцию, зафиксировать и сохранить внутреннее состояние объекта так, чтобы позднее восстановить его в это состояние.

    java.util.Date (сеттеры как раз выполняют это правило - внутренне Date представлен типом long)
    Классы, реализующие java.io.Serializable
    Классы, реализующие javax.faces.component.StateHolder

Наблюдатель (Observer или Publish/Subscribe) - Создает механизм у класса, который позволяет получать экземпляру объекта этого класса оповещения от других объектов об изменении их состояния, тем самым наблюдая за ними.

    java.util.Observer/java.util.Observable
    реализации java.util.EventListener
    javax.servlet.http.HttpSessionBindingListener
    javax.servlet.http.HttpSessionAttributeListener
    javax.faces.event.PhaseListener

Состояние (State) - содержит методы, которые меняют поведение в зависимости от состояния экземпляра, которое может быть изменено из "внешнего мира"

    javax.faces.lifecycle.LifeCycle#execute() (контролируется FacesServlet, поведение меняется в зависимости от фазы (состояния) JSF)

Стратегия (Strategy) - имеет возможность вызывать метод у разных реализаций определенного класса, в то время как эти реализации передаются в качестве параметра. Это позволяет выбирать алгоритм путем определения соответствующего класса. Этот шаблон позволяет менять выбранный алгоритм независимо от объектов-клиентов, которые его используют.

    java.util.Comparator#compare(), например, выполняется методом Collections#sort()
    javax.servlet.http.HttpServlet, метод service() и методы doXXX() принимают как параметр HttpServletRequest и HttpServletResponse реализованный объект должен обработать их, при этом не используя параметры в качестве переменных экземпляра
    javax.servlet.Filter#doFilter()

Шаблонный метод (Template method) - содержит методы, которые уже имеют реализацию "по умолчанию". Это позволяет  наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.

    Неабстрактные методы  java.io.InputStream, java.io.OutputStream, java.io.Reader и java.io.Writer.
    Неабстрактные методы java.util.AbstractList, java.util.AbstractSet и java.util.AbstractMap.
    javax.servlet.http.HttpServlet, методы doXXX() по умолчанию шлют HTTP 405 "Method Not Allowed"

Посетитель (Visitor) -  описывает операцию, которая выполняется над объектами других классов. При изменении visitor нет необходимости изменять обслуживаемые классы. Демонстрирует прием восстановления информации о потерянных типах, не прибегая к понижающему приведению типов.

    javax.lang.model.element.AnnotationValue и AnnotationValueVisitor
    javax.lang.model.element.Element и ElementVisitor
    javax.lang.model.type.TypeMirror и TypeVisitor

1 комментарий: