Примеры шаблонов проектирования GoF в основных библиотеках Java

Проблема заключается не в отсутствующем объявлении функции (который отсутствует, так как вы включили ).

В этой проблеме отсутствует информация об отладке для sqrt, которую вы фактически используете. Без этой информации об отладке GDB не знает, какой тип параметра перейти на sqrt() и что он возвращает.

Вы можете получить требуемую информацию об отладке во многих дистрибутивах Linux, установив пакет libc-debuginfo. Вот что я вижу в такой системе:

gdb -q ./a.out
Reading symbols from /tmp/a.out...done.
(gdb) b main
Breakpoint 1 at 0x400558: file t.c, line 6.
(gdb) r

Breakpoint 1, main () at t.c:6
6     printf("sqrt(3): %f\n", sqrt(3));
(gdb) p sqrt
$1 = {} 0x7ffff7b7fb50 <__sqrt>

Примечание: «no debug info»

(gdb) p sqrt(3)
$2 = 0
(gdb) p sqrt(3.0)
$3 = 0

Примечание: соответствует вашему поведению. Что sqrt функции do имеют информацию об отладке?

(gdb) info func sqrt
All functions matching regular expression "sqrt":

File ../sysdeps/x86_64/fpu/e_sqrt.c:
double __ieee754_sqrt(double);

File s_csqrt.c:
complex double __csqrt(complex double);

File ../sysdeps/x86_64/fpu/e_sqrtf.c:
float __ieee754_sqrtf(float);

File w_sqrtf.c:
float __sqrtf(float);

File s_csqrtf.c:
complex float __csqrtf(complex float);

File ../sysdeps/i386/fpu/e_sqrtl.c:
long double __ieee754_sqrtl(long double);

File w_sqrtl.c:
long double __sqrtl(long double);

File s_csqrtl.c:
complex long double __csqrtl(complex long double);

File ../sysdeps/ieee754/dbl-64/mpsqrt.c:
void __mpsqrt(mp_no *, mp_no *, int);

File w_sqrt.c:
double __sqrt(double);

(gdb) p __sqrt
$4 = {double (double)} 0x7ffff7b7fb50 <__sqrt>

Примечание: __sqrt имеет тот же адрес, что и sqrt, но GDB знает его тип!

(gdb) p __sqrt(3)
$5 = 1.7320508075688772
(gdb) p __sqrt(3.0)
$6 = 1.7320508075688772

Можно резонно утверждать, что это ошибка в GDB. Не стесняйтесь создавать его в bugzilla .

672
задан 16 revs, 7 users 56% 11 April 2015 в 03:40
поделиться

6 ответов

Обзор множества паттернов проектирования можно найти в Википедии. Там также упоминается, какие паттерны упоминаются в GoF. Я обобщу их здесь и постараюсь привести как можно больше реализаций паттернов, встречающихся как в Java SE, так и в Java EE API.


Креативные паттерны

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

Builder (распознается по методам создания, возвращающим сам экземпляр)

Factory method (распознается по методам создания, возвращающим реализацию абстрактного/интерфейсного типа)

Prototype (распознается по методам создания, возвращающим другой экземпляр самого себя с теми же свойствами)

Singleton (распознается по методам создания, возвращающим один и тот же экземпляр (обычно самого себя) каждый раз)


Структурные паттерны

Adapter (распознаются по методам создания, принимающим экземпляр другого абстрактного/интерфейсного типа и возвращающим реализацию собственного/другого абстрактного/интерфейсного типа, который украшает/переопределяет данный экземпляр)

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

  • Пока ничего не приходит на ум. Вымышленным примером может быть new LinkedHashMap(LinkedHashSet, List), который возвращает неизменяемую связанную карту, которая не клонирует элементы, а использует их. Методы java.util.Collections#newSetFromMap() и singletonXXX() тем не менее приближаются к этому.

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

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

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

Flyweight (узнается по методам создания, возвращающим кэшированный экземпляр, немного "многотонная" идея)

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


Поведенческие паттерны

Цепочка ответственности (распознается по поведенческим методам, которые (косвенно) вызывают тот же метод в другой реализации того же абстрактного/интерфейсного типа в очереди)

Command (распознается по методам поведения в абстрактном/интерфейсном типе, который вызывает метод в реализации другого абстрактного/интерфейсного типа, который был инкапсулирован реализацией команды во время ее создания)

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

Iterator (узнаваемы по поведению методов, последовательно возвращающих из очереди экземпляры разных типов)

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

Memento (распознается по поведению методов, которые внутренне изменяют состояние экземпляра whole)

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

State (распознается по поведенческим методам, изменяет свое поведение в зависимости от состояния экземпляра, которым можно управлять извне)

Strategy (распознаваемый по методам поведения в абстрактном/интерфейсном типе, который вызывает метод в реализации другого абстрактного/интерфейсного типа, который был передан в качестве аргумента метода в реализацию стратегии)

Шаблонный метод (распознается по поведению методов, которые уже имеют поведение "по умолчанию", определенное абстрактным типом)

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

3130
ответ дан 22 November 2019 в 21:44
поделиться
  1. Шаблон наблюдателя на протяжении всего колебания ( Наблюдатель , Наблюдатель )
  2. MVC также в разработке
  3. Шаблон адаптера: InputStreamReader и OutputStreamWriter NOTE: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdapter are not adapters; they are actually Null Objects. Poor naming choice by Sun.
  4. Decorator pattern (BufferedInputStream can decorate other streams such as FilterInputStream)
  5. AbstractFactory Pattern for the AWT Toolkit and the Swing pluggable look-and-feel classes
  6. java.lang.Runtime#getRuntime() is Singleton
  7. ButtonGroup for Mediator pattern
  8. Action, AbstractAction may be used for different visual representations to execute same code -> Command pattern
  9. Interned Strings or CellRender in JTable for Flyweight Pattern (Also think about various pools - Thread pools, connection pools, EJB object pools - Flyweight is really about management of shared resources)
  10. The Java 1.0 event model is an example of Chain of Responsibility, as are Servlet Filters.
  11. Iterator pattern in Collections Framework
  12. Nested containers in AWT/Swing use the Composite pattern
  13. Layout Managers in AWT/Swing are an example of Strategy

and many more I guess

105
ответ дан 22 November 2019 в 21:44
поделиться
  1. Flyweight используется с некоторыми значениями Byte, Short, Integer, Long и String.
  2. Facade ] используется во многих местах, но наиболее очевидным является интерфейс сценариев.
  3. Singleton - приходит на ум java.lang.Runtime.
  4. Abstract Factory - также сценарии и JDBC API.
  5. Команда - Отмена / возврат TextComponent.
  6. Интерпретатор - RegEx (java.util.regex. ) и SQL (java.sql. ) API.
  7. Prototype - Не уверен на 100%, если это количество, но я думаю, что метод g clone () можно использовать для для этой цели.
50
ответ дан 22 November 2019 в 21:44
поделиться

Шаблон «Абстрактная фабрика» используется в разных местах. Например, DatagramSocketImplFactory , PreferencesFactory . Их гораздо больше - поищите в документации Javadoc интерфейсы, в названии которых есть слово «Factory».

Также существует довольно много экземпляров шаблона Factory.

27
ответ дан 22 November 2019 в 21:44
поделиться

Even though I'm sort of a broken clock with this one, Java XML API uses Factory a lot. I mean just look at this:

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);

...and so on and so forth.

Additionally various Buffers (StringBuffer, ByteBuffer, StringBuilder) use Builder.

22
ответ дан 22 November 2019 в 21:44
поделиться

RMI основан на прокси.

Можно указать один для большинства из 23 шаблонов в GoF:

  1. Абстрактная фабрика: все интерфейсы java.sql получают свои конкретные реализации из JDBC JAR, когда драйвер зарегистрирован.
  2. Builder: java.lang.StringBuilder.
  3. Factory Method: XML-фабрики и др.
  4. Прототип: Возможно clone (), но я не уверен, что Я покупаю это.
  5. Синглтон: java.lang.System
  6. Адаптер: классы адаптера в java.awt.event, например, WindowAdapter.
  7. Мост: классы коллекции в java.util. Список реализован ArrayList.
  8. Составной: java. awt. java.awt.Component + java.awt.Container
  9. Декоратор: во всем пакете java.io.
  10. Фасад: ExternalContext действует как фасад для выполнения файлов cookie, области сеанса и подобных операций.
  11. Легковес: целое число, символ и т. Д.
  12. Прокси-сервер: пакет java.rmi
  13. Цепочка ответственности: фильтры сервлетов
  14. Команда: элементы меню Swing
  15. Интерпретатор: непосредственно в JDK, но JavaCC определенно использует это.
  16. Итератор: интерфейс java.util.Iterator; не может быть яснее этого.
  17. Посредник: JMS?
  18. Мементо:
  19. Наблюдатель: java.util.Observer/Observable (хотя и плохо сделано)
  20. Состояние:
  21. Стратегия:
  22. Шаблон:
  23. Посетитель:

Я не могу вспомнить примеры на Java для 10 из 23, но я посмотрю, смогу ли я сделать лучше завтра. Вот для чего нужна правка.

Контейнер
  • Декоратор: по всему пакету java.io.
  • Фасад: ExternalContext ведет себя как фасад для выполнения файлов cookie, области сеанса и подобных операций.
  • Легковес: целое число, символ и т. Д. .
  • Прокси: пакет java.rmi
  • Цепочка ответственности: фильтры сервлетов
  • Команда: Пункты меню Swing
  • Интерпретатор: Нет непосредственно в JDK, но JavaCC определенно использует это.
  • Итератор: java. util.Iterator интерфейс; не может быть яснее этого.
  • Посредник: JMS?
  • Мементо:
  • Наблюдатель: java.util.Observer/Observable (хотя и плохо сделано)
  • Состояние:
  • Стратегия:
  • Шаблон:
  • Посетитель:
  • Я не могу вспомнить примеры на Java для 10 из 23, но я посмотрю, смогу ли я сделать лучше завтра. Вот для чего нужна правка.

    Контейнер
  • Декоратор: по всему пакету java.io.
  • Фасад: ExternalContext ведет себя как фасад для выполнения файлов cookie, области сеанса и подобных операций.
  • Легковес: целое число, символ и т. Д. .
  • Прокси: пакет java.rmi
  • Цепочка ответственности: фильтры сервлетов
  • Команда: пункты меню Swing
  • Интерпретатор: Нет непосредственно в JDK, но JavaCC определенно использует это.
  • Итератор: java. util.Iterator интерфейс; не может быть яснее этого.
  • Посредник: JMS?
  • Мементо:
  • Наблюдатель: java.util.Observer/Observable (хотя и плохо сделано)
  • Состояние:
  • Стратегия:
  • Шаблон:
  • Посетитель:
  • Я не могу вспомнить примеры на Java для 10 из 23, но я посмотрю, смогу ли я сделать лучше завтра. Вот для чего нужна правка.

    ExternalContext действует как фасад для выполнения файлов cookie, области сеанса и аналогичных операций.
  • Легковес: целое число, символ и т. Д.
  • Прокси: пакет java.rmi
  • Цепочка ответственности: фильтры сервлетов
  • Команда: пункты меню Swing
  • Интерпретатор: Нет непосредственно в JDK, но JavaCC определенно использует это.
  • Итератор: интерфейс java.util.Iterator; не может быть яснее этого.
  • Посредник: JMS?
  • Мементо:
  • Наблюдатель: java.util.Observer/Observable (хотя и плохо сделано)
  • Состояние:
  • Стратегия:
  • Шаблон:
  • Посетитель:
  • Я не могу вспомнить примеры на Java для 10 из 23, но я посмотрю, смогу ли я сделать лучше завтра. Вот для чего нужна правка.

    ExternalContext действует как фасад для выполнения файлов cookie, области сеанса и аналогичных операций.
  • Легковес: целое число, символ и т. Д.
  • Прокси: пакет java.rmi
  • Цепочка ответственности: фильтры сервлетов
  • Команда: пункты меню Swing
  • Интерпретатор: Нет непосредственно в JDK, но JavaCC определенно использует это.
  • Итератор: интерфейс java.util.Iterator; не может быть яснее этого.
  • Посредник: JMS?
  • Мементо:
  • Наблюдатель: java.util.Observer/Observable (хотя и плохо сделано)
  • Состояние:
  • Стратегия:
  • Шаблон:
  • Посетитель:
  • Я не могу вспомнить примеры на Java для 10 из 23, но я посмотрю, смогу ли я сделать лучше завтра. Вот для чего нужна правка.

    и т. д.
  • Прокси: пакет java.rmi
  • Цепочка ответственности: фильтры сервлетов
  • Команда: пункты меню Swing
  • Интерпретатор: Нет непосредственно в JDK, но JavaCC определенно использует это.
  • Итератор: java .util.Iterator интерфейс; не может быть яснее этого.
  • Посредник: JMS?
  • Мементо:
  • Наблюдатель: java.util.Observer/Observable (хотя и плохо сделано)
  • Состояние:
  • Стратегия:
  • Шаблон:
  • Посетитель:
  • Я не могу вспомнить примеры на Java для 10 из 23, но я посмотрю, смогу ли я сделать лучше завтра. Вот для чего нужна правка.

    и т. д.
  • Прокси: пакет java.rmi
  • Цепочка ответственности: фильтры сервлетов
  • Команда: пункты меню Swing
  • Интерпретатор: Нет непосредственно в JDK, но JavaCC определенно использует это.
  • Итератор: java .util.Iterator интерфейс; не может быть яснее этого.
  • Посредник: JMS?
  • Мементо:
  • Наблюдатель: java.util.Observer/Observable (хотя и плохо сделано)
  • Состояние:
  • Стратегия:
  • Шаблон:
  • Посетитель:
  • Я не могу вспомнить примеры на Java для 10 из 23, но я посмотрю, смогу ли я сделать лучше завтра. Вот для чего нужна правка.

  • Наблюдатель: java.util.Observer/Observable (хотя сделано плохо)
  • Состояние:
  • Стратегия:
  • Шаблон:
  • Посетитель:
  • Я не могу вспомнить примеры на Java на 10 из 23, но я посмотрю, смогу ли я завтра добиться большего. Вот для чего нужна правка.

  • Наблюдатель: java.util.Observer/Observable (хотя сделано плохо)
  • Состояние:
  • Стратегия:
  • Шаблон:
  • Посетитель:
  • Я не могу вспомнить примеры на Java на 10 из 23, но я посмотрю, смогу ли я завтра добиться большего. Вот для чего нужна правка.

    41
    ответ дан 22 November 2019 в 21:44
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: