Шаблоны проектирования: композит против композиции - PullRequest
25 голосов
/ 31 января 2012

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

  1. Это правильно? Может кто-нибудь объяснить мне это немного лучше?
  2. Когда бы я предпочел одно другому?

1 Ответ

49 голосов
/ 31 января 2012

Композиция

Это концепция дизайна (на самом деле не шаблон).Этот термин используется, когда вы хотите описать один объект, содержащий другой.Это происходит очень часто в Состав над наследованием Обсуждение.

Кроме того, состав подразумевает сильную собственность.Один объект владеет (т.е. управляет жизненным циклом) другого объекта.Когда родитель уничтожен, все дети также уничтожены.Если таких сильных отношений нет (дети могут пережить родителя), мы говорим о агрегации .

Цитата замечательный пример в Википедии :

Например, университет владеет различными факультетами (например, химией), и на каждом факультете есть несколько профессоров.Если университет закроется, кафедры больше не будут существовать, но профессора на этих кафедрах продолжат существовать .Следовательно, университет можно рассматривать как состав кафедр , тогда как кафедр имеют совокупность профессоров .Кроме того, профессор может работать более чем на одном факультете, но факультет не может быть частью более чем одного университета.

Таким образом, как вы можете видеть, вы должны выбирать между составом или объединением в зависимости отТип отношений собственности.

Составной шаблон

Это шаблон проектирования GoF, описывающий прочные отношения родитель-потомок, где дочерний элемент может быть простым узлом или контейнеромдругие узлы (возможно, содержащие другие дочерние элементы).

Это очень часто встречается в графическом интерфейсе и древовидной структуре.Например, в Java Swing JPanel может содержать различные элементы управления, такие как текстовые поля, метки, списки и т. Д., Но может содержать и другие JPanel, которые, в свою очередь, могут содержать простые компоненты и даже больше вложенных панелей.

Обычно Составной шаблон проектирования использует композицию, однако в некоторых случаях родитель не должен владеть всеми дочерними элементами.Чтобы продолжить пример с графическим интерфейсом, вы можете взять одну панель и переместить ее в другое место (сменить родителя).

...