Re[4]: Паттерны. Тестовые задачки.
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 22.09.04 07:32
Оценка:
Здравствуйте, Аноним, Вы писали:

SYG>>>Пусть есть пирамида агрегирования.

А>У предложенной вами задачки решение написано прямо в книге. Т.е. используем паттерн Compose.
А>Все объекты между Factory и Object — есть суть один объект Composite, который содержит ссулки на родителя и потомков. Родители и потомки могут быть также составными. Т.е можно вводить любое кол-во доп. уровней без перепроектирования приложения.
А>Прийдется видать что-то придумывать себе самому.

Все не так просто! Я бы не стал предлагать Вам задачку решаемую с помощью одного всем известного паттерна. Естественно, агрегат есть composite, но как Вы собираетесь эту систему заставить работать? Как передавать информацию вниз и вверх по уровням агрегации? Как агрегат должен вызывать методы у своих компонентов, а у компонентов компонентов и т.д. вниз по уровням агрегации? А как компоненты будут вызывать методы своего агрегата, агрегата-агрегата и т.д. вверх по уровням агрегации?

Тупой ответ может быть таким:
1) Вниз по уровням агрегации:
Node.View.Location.SetPosition(X, Y);

2) Вверх по уровням агрегации:
node := SELF.Domain.Document.Environment.Factory.NewNode();

Но такое решение жестко фиксирует всю архитектуру приложения. Мы не можем разобрать такую пирамиду агрегации ни сверху, ни, тем более, снизу. Мы не можем вставить дополнительные слои и не можем вынуть существующие слои агрегации. К примеру

Было:
Node.View.Location.SetPosition(X, Y);

Хотим вставить между View и Location дополнительный слой агрегации Graphic2D, тогда все строчки кода подобные вышеприведенной придется переписать на новые:
Node.View.Graphic2D.Location.SetPosition(X, Y);



Или так:
Было
node := SELF.Domain.Document.Environment.Factory.NewNode();

Между Environment и Factory появился новый слой агрегации System, тогда все строчки кода подобные вышеприведенной придется переписать на новые:
node := SELF.Domain.Document.Environment.System.Factory.NewNode();


Вопрос в том как реализовать агрегацию (composite) так чтобы потом ее можно было по всякому разбирать и собирать добавляя или удаляя уровни агрегации не переписывая при этом код.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.