2010-07-07 3 views
1

Я просто понимаю, как написать хорошую архитектуру хорошего программного обеспечения , и я изучаю, как разделять компоненты высокого уровня на слои. В этом случае я пытаюсь использовать Tiers, чтобы смоделировать каждый слой как черный .Проблема дизайна публикации/подписчика N-уровня

В моей архитектуре 4 уровня: презентация, прикладные услуги, Бизнес-логика и домен/постоянство. Для целей моего вопроса, , нам действительно нужно сосредоточиться только на презентации и приложениях.

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

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

Я программирую это приложение на Java, поэтому очевидная вещь для использования - Observable/Observer. Тем не менее, мне не нравится, что метод обновления для интерфейса Observer заставляет вас использовать аргументы объекта. Я хочу обойти , указав свой собственный интерфейс и класс для этого механизма. Таким образом, проблема заключается в том, что логика приложения будет зависеть от интерфейса от представления Tier, определенного для этой архитектуры нет-нет. Является ли это признаком того, что я должен попробовать моделирование с помощью MVC fore-most и Layer the Model? Или было бы лучше, если бы модель смоделировала каждый из видов с интерфейсом, известным на уровне приложений. Кажется, это плохое место, и я застрял. Кроме того, я использую шаблон проектирования View-Handler для обработки нескольких видов.

ответ

0

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

Я был бы более склонен исследовать чистую модель событий с услугами, предоставляющими способ регистрации EventListeners и срабатывания, возможно, PropertyChangeEvent, когда произойдет изменение.

Уровень сервиса может быть затем уведомлен о других услугах или уведомлять уровень представления - он не знает и не заботится, и только презентация связана с услугой посредством регистрации в качестве слушателя.

+0

Я согласен - классы Observer/Observable были добавлены в исходные спецификации java и были такими же бесполезными, как сегодня. Хотелось бы, чтобы они осуждали и избавлялись от них, поскольку все, что они делают, путают людей и ведут их по неправильному пути. – rancidfishbreath

+0

Это звучит как хорошее решение. Однако мне трудно понять, как базовая модель на Уровне услуг распространяет информацию на уровень презентации. Если презентация содержит прослушиватель действий, который является регистром для модели, как представление извлекает нужные ему данные при запуске этого объекта PropertyChangeEvent? – Mike

+0

Я предположил, что уровень сервиса обеспечит способы получения данных для уровня представления, но в любом случае [PropertyChangeEvent] (http://java.sun.com/j2se/1.4.2/docs/api/java/ beans/PropertyChangeEvent.html) имеет методы getPropertyName() ',' getOldValue() 'и' getNewValue() '. Тот, кто пожалеет событие, должен заполнить соответствующую информацию. Вы также можете основывать свои действия на Action и ActionListeners или получать собственные пользовательские события и EventListeners, в зависимости от того, что имеет наибольший смысл с учетом (неизвестных мне) деталей вашей системы. –

0

Мне кажется, что ваш вопрос меньше о публикации/подписке, чем о том, как заставить слои общаться.

Короткий ответ:

Использование MVC/MVP. Посмотрите сообщения в блогах о них, загрузите исходный код и помните: если у вас все есть молот, все выглядит как гвоздь. Значение не применяет шаблоны, потому что они у вас есть, применяйте их, потому что они вам нужны.

Длинный ответ:

Если вы работаете в Java, я предлагаю Head First Design Patterns который познакомит вас ориентирован на способ мышления в шаблонах. После того, как у вас есть голова вокруг шаблонов дизайна, которые, я думаю, вы сейчас на пути, вы можете посмотреть Patterns of Enterprise Application Architecture. Не стесняйтесь пропустить Head First, но это очень хорошая книга, которую я очень рекомендую, если вы входите в архитектуру.

После того как вы переварили книгу Фаулера или, по крайней мере, получили базовое представление о архитектуре N-Tiered Enterprise Architecture, вам должно быть хорошо на вашем пути.

+0

Вы правы. Мой вопрос, безусловно, больше связан с коммуникацией Layer. Мое предлагаемое решение - механизм распространения изменений, учитывая силы, которые должно обновляться в результате изменения модели, и что несколько представлений должны иметь легкий доступ к этой модели. Опубликовать/Подписчик может и не быть лучшим способом. Итак, с учетом сказанного, вы предлагаете, чтобы каждый раз, когда я сталкивался с этой проблемой с многоуровневой архитектурой, я обращаюсь к MVC? Если это правда, слои кажутся слабыми, и я уверен, что это не так. – Mike

+0

Продолжая, я выбежал из комнаты. :( Я прочитал несколько шаблонов дизайна головы. Все было в порядке. Я читал книгу «Банда четырех», «Голуб на рисунках» и «Образцы архитектуры программного обеспечения», том I. Я скоро собирался в книгу Фаулера Трудно отличить, когда использовать определенные шаблоны, потому что некоторые из них настолько могущественны. Есть ли какие-нибудь книги специально для N-Tiered? Кажется, это отличный маршрут, чтобы пройти много времени (это могло быть супер наивное утверждение.) – Mike