КаталогИндекс раздела
НазадОглавлениеВперед

Использование шаблонов для раскрытия программного обеспечения

Обзор

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

Всестороннее знание шаблонов проектирования помогает во всех этих задачах, а кроме того и в задаче построения нового программного обеспечения и расширении существующего хорошо структурированного программного обеспечения.

В этой главе учебника мы изучим общий шаблон проектирования Publish/Subscribe (P/S) (публикация/подписка) и более специфический шаблон проектирования Event Channel (канал событий). Затем мы применим то, что мы знаем к Службе Сообщений Java (Java Message Service - JMS). В конце главы вы будете иметь некоторое представление о том, в чем JMS похожа на P/S и шаблон Event Channel, а в чем отличается.

Шаблон Publish/Subscribe

Сердцем большинства современных систем, базирующихся на событиях, является механизм P/S. Он по природе похож на шаблон GOF Observer. Проблема, которую решает P/S возникает, когда один объект имеет данные, от которых зависит другой объект. Например, когда я нахожусь в плохом настроении, было бы прекрасно, если бы я мог опубликовать эту информацию для тех, кто может зависеть от моего настроения. Моя семья будет, конечно, иметь подписку на эти данные и отреагирует на них, держась от меня подальше!

Для реализации P/S объект (издатель) имеет интерфейс, который клиенты (подписчики) используются, чтобы подписаться на изменения. После подписки издатель добавляет подписчика во внутренний список клиентов, которые будут информироваться об изменениях данных. Когда состояние объекта меняется, издатель перебирает список подписчиков, информируя каждого, как показано в приведенной ниже диаграмме последовательности UML:

Базовая реализация P/S

Система P/S включает в себя два класса, как показано на следующей диаграмме. Subscriber обычно реализует интерфейс с методом notify (или ему подобным). Publisher обычно имеет открытый метод Subscribe (или ему подобный), который принимает в качестве аргумента Subscriber.

Разнообразные механизмы используются в Publisher, чтобы отслеживать Subscribers'ов. На приведенной выше диаграмме используется хешированная таблица, другие реализации используют векторы или массивы. Обычно системы P/S также имеют какие-то способы для запуска механизма порождения событий. В Publisher, показанном выше, защищенный метод notify приказывает Publisher породить событие для Subscriber'ов.

Шаблон Event Channel

Шаблон Event Channel от Object Management Group (OMG) расширяет P/S функциями, более приспособленными к распределенной среде. Канал событий создает централизованный канал для событий. Этот централизованный канал позволяет объектам публиковать события или подписываться на события. Механизм канала событий значительно расширяет базовый шаблон P/S в том, что подписчик может получать опубликованные события от более, чем одного объекта, даже если он зарегистрирован только на одном канале.

Шаблон Event Channel использует объекты-представители для подписки на канал событий и объект-представитель для публикации событий в канале. Использование представителей позволяет представителям существовать вне границ настоящего издателя или подписчика. Концептуальное представление канала событий показано ниже:

Шаблон Event Channel использует сильно типизированные события; это означает, что подписчик может ожидать поступления определенных типов данных события, если регистрируется для определенного события. Он также позволяет подписчику и проталкивать, и вытягивать события вместо того, чтобы только получать события, посланные ему..

Понимание Java Message Service

То, что мы знаем о шаблонах P/S и Event Channel, должно помочь вам быстро освоить Java Message Service (JMS). Детали реализации JMS отличаются от описанных выше, но концептуально и в проектном отношении JMS отражает шаблоны проектирования P/S и Event Channel.

Вы сразу же заметите сходство в концептуальной документации JMS и двух шаблонов проектирования. Большинство концептуальных обзоров JMS включают в себя диаграмму, похожую на следующую:

Ключевые моменты кода

Приведенный выше обзор дает вам первый намек на сходство между JMS и шаблонами P/S и Event Channel. Далее просмотр кодов для всех трех систем подтвердит ваши предположения. Сеансы при помощи JMS подписываются на темы и публикуют в темах. Подписчики и издатели встречаются в очередях и темах. Например, следующий код является подмножеством кода, который создает соединение с темой и впоследствии публикует сообщение в этой теме:

TopicPublisher publisher = publishSession.createPublisher(topic);
TextMessage message = publishSession.createTextMessage();
message.setText("Hello");
publisher.publish(message);

Подписчики обрабатываются схожим образом, они находятся в теме JMS и подписаны на нее, как показано ниже:

TopicSubscriber subscriber = subscribeSession.createSubscriber(topic);
subscriber.setMessageListener(this);

Этот код значительно сокращен и призван иллюстрировать одну вещь: вы не должны ничего знать о JMS или даже компилировать какой-либо код, чтобы понимать, что вы работаете с общим шаблоном проектирования P/S, и что JMS более походит на шаблон проектирования Event Channel.

Изучение шаблонов проектирования

Даже поверхностное понимание шаблонов P/S и Event Channel позволяет нам быстро понять базовую структуру JMS. Последующие объяснения принесут вам новые открытия. Вы найдете, что есть и много различий, и много совпадений между реализациями Event Channel и JMS. Например, JMS включает в себя доставку событий точка-в-точку, как и доставку многие-к-многим, допускаемую каналами событий. Напротив, шаблон Event Channel допускает сильную типизацию, а JMS - нет.

Это интересные вопросы, но для них нужно более глубоко понимать, как работает JMS. Это понимание станет более полезным при применении его к вашему собственному программному проекту.

Резюме

В этой главе учебника мы изучили основы (только самые основы) шаблонов проектирования P/S и Event Channel. Затем мы применили то, что мы узнали об этих шаблонах, к JMS. Из краткого обзора концептуальной диаграммы и нескольких кодовых примеров мы увидели, что JMS является в основном механизмом P/S с многими атрибутами, похожими на катал событий.

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


© IBM Corp.
НазадОглавлениеВперед
КаталогИндекс раздела