Может ли шаблон составного дизайна избежать структуры данных Collection (List, HashTable)? - PullRequest
0 голосов
/ 13 мая 2019

Мне нужно полное понимание всех возможных типов шаблонов составного дизайна при просмотре кода.В этом коде у меня есть составной объект PeanutButterAndJellySandwich, который содержит Bread, PeanutButter и Jelly.

Причина, по которой переменные поля PeanutButterAndJellySand, все из которых относятся к типу food, заключается в учете калорий

interface Food{
    int calories = 9000;
}


class Bread implements Food{
    private String flour;
    private String salt;

}

class Jelly implements Food{
    private String fruit;
    private String sugar;
}

class PeanutButter implements Food{
    private boolean crunchy;
}

class PeanutButterAndJellySandwich implements Food{
    private Food bread;
    private Food jelly;
    private Food peanutButter;

    public void setBread(Bread bread){this.bread=bread;}
    public void setJelly(Jelly jelly){this.jelly=jelly;}
    public void setPeanutButter(PeanutButter butter){this.peanutButter=butter;}
}

Это соответствует шаблону составного дизайна или PeanutButterAndJellySandwhich нужно что-то вроде foodItems:ArrayList<Food>.Диаграмма UML будет выглядеть очень похоже.

UML Diagram

Я спрашиваю об этом, потому что я не нашел этого нигде в явном виде после примерно 5 часов поиска и применения чего-то вроде встроенногоВ системе нам может не потребоваться структура сбора данных, так как память / хранилище ограничены.Тем не менее, все примеры в Интернете используют много форм списков.

Ответы [ 3 ]

4 голосов
/ 13 мая 2019

Насколько я понимаю, составной шаблон позволяет игнорировать разницу между компонентами (Bread, Jelly, PeanutButterAndJellySandwich и т. Д. В вашем случае) и их иерархией, наиболее вероятно используя полиморфизм во время выполнения. Он предназначен для того, чтобы вы могли обрабатывать их в форме (скорее всего, через цикл) и позволить среде выполнения выполнять rest .

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

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


приписка

  1. Но шаблоны проектирования не являются чем-то священным. Они предназначены скорее как руководство, а не как ограничение.

  2. Я бы сказал, что сам вопрос не имеет большого смысла, потому что шаблоны проектирования предназначены не для экономии памяти, а для продвижения хороших систем. Таким образом, они описаны в общем виде, чтобы их было проще описать и понять.

3 голосов
/ 14 мая 2019

Составной шаблон используется для создания древовидных структур.В случае с вашим сэндвичем это не имеет особого смысла.У вас есть простой слой (список) из Ingredients.За исключением того, что вы хотите иметь сэндвич как часть сэндвича.Для меня ваш дизайн просто сломан.Используйте шаблоны, где они применяются.Не применяйте шаблоны, потому что они существуют.

0 голосов
/ 14 мая 2019

Строго говоря, составной шаблон согласно Gamma, Helm et.al. говорит о манипулировании дочерними элементами через интерфейс (в вашем случае, Food), который может привести вас к реализации, в которой любое количество дочерних элементов может быть добавлено (или удалено) к любому узлу в составномдерево.Типичная реализация может включать в себя абстрактный суперкласс, который будет реализовывать дочернее управление (добавление, удаление и т. Д.), А затем из этого будут выведены конкретные подтипы.Примерно так:

enter image description here

Есть варианты дизайна, которые я здесь делаю, но суть правильная.

Однако в более широком смысле состав не требует реализации составного шаблона .Использование композиции просто прекрасно без нее, на самом деле есть принцип, также обсуждаемый Gamma, Helm et.al. , который говорит о предпочтении композиции перед наследованием и не имеет ничего общего с составным шаблоном как таковым.

Заманчиво использовать наследование как удобный способ повторного использования кода в вашей программе, но это действительно так.не в том, что такое наследование, поэтому составление предпочтительнее как способ защиты от неправильного использования наследования и создания в результате неуправляемого кода.Боюсь, это может быть связано с тем, что вы используете интерфейс Food для доступа к переменной члена Calories.Если вы не обобщаете свой дизайн, то есть хотите быть конкретным относительно того, что PeanutButterAndJellySandwich содержит во время разработки (в структуре вашего кода), то вам, вероятно, следует объявить переменные внутри PeanutButterAndJellySandwich с использованием их конкретных типов.Это Food , нет никаких сомнений, но рассмотрим, что PeanutButterAndJellySandwich собирается делать с переменными-членами, которые все объявлены как Food ?Зачем не использовать массив Food?

...