Реклама

среда, 1 июля 2015 г.

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

Продолжаем серию статей на тему примеров шаблонов (паттернов) проектирования из JDK. Первую статью можете прочитать здесь.
Сегодня рассмотрим какие структурные шаблоны проектирования (structural patterns) можно найти в исходных кодах Java Development Kit

Адаптер (Adapter) - содержит порождающие методы, которые получают в качестве параметра экземпляр одного типа (класса или интерфейса), и возвращают реализацию своего собственного типа, который "декорирует" или переопределяет исходный экземпляр

    java.util.Arrays#asList()
    java.io.InputStreamReader(InputStream) (возвращает Reader)
    java.io.OutputStreamWriter(OutputStream) (возвращает Writer)
    javax.xml.bind.annotation.adapters.XmlAdapter#marshal() and #unmarshal()

Мост (Bridge) -  содержит порождающие методы, которые получают в качестве параметра экземпляр определенного типа, и возвращают реализацию класса или интерфейса, который делегирует вызовы переданного экземпляра. Другими словами, мост служит для отделения интерфейса от реализации. В шаблоне DAO объект DAO, с точки зрения приложения, является мостом. Приложение использует интерфейс DAO, который не меняется при изменении СУБД. Также архитектура Java AWT основана на этом паттерне. Также можно указать как пример LinkedHashMap(LinkedHashSet<K>, List<V>) который возвращает немодифицируемый linked map, который не клонирует объекты, но использует их.

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

    java.awt.Container#add(Component)
    javax.faces.component.UIComponent#getChildren()

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

    Все подклассы of java.io.InputStream, OutputStream, Reader and Writer имеют конструкторы того же типа.
    java.util.Collections, методы the checkedXXX(), synchronizedXXX() и unmodifiableXXX().
    javax.servlet.http.HttpServletRequestWrapper и HttpServletResponseWrapper

Фасад (Facade) - содержит методы, которые внутренне используют экземпляры разных независимых типов (классов или реализации интерфейсов)

    javax.faces.context.FacesContext, внутренне использует LifeCycle, ViewHandler, NavigationHandler и много других не заставляя пользователя заботиться об этом.
    javax.faces.context.ExternalContext, использует ServletContext, HttpSession, HttpServletRequest, HttpServletResponse, и др.

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

    java.lang.Integer#valueOf(int) (это же касается Boolean, Byte, Character, Short and Long)

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

    java.lang.reflect.Proxy
    java.rmi.*, все API построено на этом принципе.

Третья статья, рассматривающая поведенческие паттерны по этой ссылке

Комментариев нет:

Отправить комментарий