Продолжаем серию статей на тему примеров шаблонов (паттернов) проектирования из 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 построено на этом принципе.
Третья статья, рассматривающая поведенческие паттерны по этой ссылке.
Сегодня рассмотрим какие структурные шаблоны проектирования (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 построено на этом принципе.
Третья статья, рассматривающая поведенческие паттерны по этой ссылке.
Комментариев нет:
Отправить комментарий