В третьей части статьи мы поговорим о примерах поведенческих шаблонов проектирования (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
Первая часть статьи здесь, а вторая здесь.
Цепочка ответственности (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
Вы проделали серьезную и нужную работу :)
ОтветитьУдалитьБлагодарю