Шаблон проектирования, который классы Wrapper используют в Java? - PullRequest
0 голосов
/ 15 ноября 2018

Я нашел старый пост , который не проясняет мое понимание шаблонов проектирования, используемых классами Wrapper. Более того, при чтении из Википедии я не получаю никакой четкой информации.

Действительно ли класс Wrapper использует какой-либо шаблон проектирования или нет?

Если он использует шаблон, то какой шаблон он из этих: Decorator Pattern, Facade Pattern или Adapter Pattern?

Ответы [ 5 ]

0 голосов
/ 16 ноября 2018

Классы обертки используют состав . Та же композиция, что и в популярном изречении " Композиция Favor over the Наследование. " Композиция не является шаблоном дизайна; однако большинство шаблонов проектирования ОО используют композицию как часть своей реализации. Это одна из причин, по которой многие люди пытаются различать разные шаблоны дизайна: общее использование композиции заставляет их в определенной степени выглядеть одинаково.

В композиционных отношениях есть две основные части: композитор и композитор. Вы можете думать об этом вообще как о части / целых отношениях. Это может быть один к одному или один ко многим. обертка - это композитор, то есть целое. Может обернуть одну или несколько составных частей.

Многие различные шаблоны проектирования используют общие композиционные отношения для разных целей. Многие из этих различных шаблонов все вместе называются «обертками». Книга GoF вызывает как минимум два таких паттерна.

  • ADAPTER Also Known As Wrapper стр. 139
  • DECORATOR Also Known As Wrapper стр. 175

Таким образом, Wrapper - это не какой-то единый шаблон проектирования; скорее это категория шаблонов дизайна. Кстати, мы видим ту же динамику с термином Factory . Не существует единого шаблона проектирования с именем Factory; скорее это категория шаблонов дизайна.

0 голосов
/ 15 ноября 2018

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

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

Еще одна альтернатива для некоторого использования обертки - наследование, но не для каждого случая.

Таким образом, обертка - это просто технический способ выполнения каких-то задач.Это не образец сам по себе.

0 голосов
/ 15 ноября 2018

Все три шаблона дизайна в некотором роде описывают оболочку:

  • Шаблон декоратора.Обертывает компонент и потенциально украшает его некоторыми дополнительными характеристиками .
  • Шаблон адаптера.Просто оборачивает компонент, чтобы обеспечить подходящий интерфейс для потребителей.
  • Шаблон фасада.Обертывание компонента для облегчения использования сложного внешнего интерфейса.
0 голосов
/ 15 ноября 2018

Они не следуют ни одному из упомянутых вами шаблонов проектирования.

Адаптер преобразует интерфейс класса в другой интерфейс.Примитивы не реализуют никаких интерфейсов.

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

A фасад состоит в том, чтобы замаскировать сложное поведение объекта, который он переносит.Нет ничего менее сложного в языке программирования, чем примитив.Подсказка в названии.Во всяком случае, классы-обертки противоположны этому.


Сверху моего здесь, вот несколько шаблонов проектирования, которые они используют:

Integer,Long и Byte используют пул объектов из мухи объектов, чтобы не создавать ненужные экземпляры .

Boolean несколько пытается быть мультитоном (в этом конструкторе не рекомендуется), но на практике это не так.

0 голосов
/ 15 ноября 2018

Если вы ссылаетесь на примитив обтекания

Классы Wrapper предоставляют способ использовать примитивные типы в качестве объектов

Адаптер шаблон является наиболее точным значением:

Декоратор позволяет добавлять или изменять поведение интерфейса во время выполнения. В качестве альтернативы, адаптер может использоваться, когда оболочка должна уважать определенный интерфейс и поддерживать полиморфное поведение , а Facade - когда требуется более простой или простой интерфейс к базовому объекту

Мы используем способность класса Wrapper для использования примитива в качестве Объектов, что означает добавление поддержки полиморфного поведения

...