реализация составного шаблона - PullRequest
1 голос
/ 08 января 2012

Я пишу код, который включает в себя составной шаблон и хотел бы получить некоторые пояснения.У меня есть Супер Менеджер, Главный Менеджер и Обычный Менеджер, и они находятся в нисходящей иерархии с Супер Менеджером наверху.

Я бы хотел, чтобы Супер Менеджер мог дать Главному Менеджеру немного денег и Главный Менеджерчтобы иметь возможность дать Обычному Менеджеру немного денег.У меня проблема в том, что я не хочу, чтобы Главный менеджер мог давать Супер Менеджеру немного денег, и я не хочу использовать instanceof, чтобы гарантировать это, так как это противоречит цели составного шаблона.

Мой главный менеджер и обычный менеджер расширяют абстрактный класс, называемый gradeManagers, в то время как мой Super Manager имеет список массивов, чтобы можно было добавлять компоненты типа gradeManagers.

Ответы [ 3 ]

5 голосов
/ 08 января 2012

Не похоже, что ваша иерархия отлично подходит для Composite паттерна.Шаблон Composite предназначен для обработки коллекции объектов так же, как и для отдельных объектов.(Подумайте о деталях, скрепленных болтами. Иногда вы хотите представить сборочный узел как единую деталь, которую можно скрепить болтами вместе с другими деталями / сборочными узлами. Сборочные узлы являются составными.) Если я понимаю, что вы такоепытаясь сделать это, у вас нет коллекции объектов Manager, которые вы хотите рассматривать как другого Manager.

Тем не менее, независимо от того, используете ли вы Composite для этого, я предлагаю добавить свойство (давайте назовем его depth), который увеличивается по мере того, как вы идете по иерархииЗатем вы можете использовать это для реализации своего бизнес-правила: менеджер может отдавать деньги другому менеджеру такого же или более высокого уровня.Это позволяет вам кодировать таким образом, чтобы избежать какого-либо представления об объектном классе.

1 голос
/ 08 января 2012

Как уже было упомянуто Тедом Хоппом, это не похоже на то, где вы использовали бы Composite Pattern.Это просто звучит как случай полиморфизма .

Составной шаблон следует использовать, когда вы хотите, чтобы группа элементов рассматривалась как один.Рассмотрим программу для рисования, в которой вы можете размещать фигуры на экране, это могут быть треугольники, квадраты и т. Д. Теперь рассмотрим функциональность, в которой вы можете изменить цвет фона этих фигур.Если вы хотите изменить цвет фона для нескольких фигур, вам нужно сделать что-то вроде этого

interface Shape {
    public void setBackgroundColor(Color c);
}

И в вашем фактическом коде реализации:

 for (Shape s : selectedShapes)
     s.setBackgroundColor(c);

Вместо этогов коде вы можете использовать составной шаблон.Это позволяет вашему коду реализации полностью игнорировать тот факт, что «фигура», которую вы хотите редактировать, на самом деле является множеством фигур, и позволяет вашему приложению обрабатывать ее как любую другую фигуру.

class CompositeShape implements Shape
{
    public void setBackgroundColor(Color c);
    for (Shape s : Shapes)
        s.setBackgroundColor(c);
}

class TriangleShape implements Shape { ... }
class SquareShape implements Shape { ... }
0 голосов
/ 11 января 2012

Я бы расширил ответ @Ted Hopp и предложил бы, чтобы вместо глубины вы могли использовать оценку. Это может быть ближе к домену, с которым вы работаете. Поскольку вы уже указали, что у вас есть менеджеры оценок, это может быть элегантным решением.

Надеюсь, это поможет.

...