Задача
Часто встаёт задача создания агрегатора какой-либо информации, например, появляющейся на разных сайтах в интернет, и выдачи её в удобоваримой (преобразованной, отфильтрованной) форме некоторому множеству пользователей. Примеров тому много — тематические ленты новостей, уведомления о результатах футбольных матчей, о появлении новых заказов и тому подобное.
Решение
В процессе проектирования одной такой системы сложилось представление об общей для всех аналогов архитектуре. Её и предлагаю ко всеобщему обзору: 
Рассмотрим основные компоненты такой архитектуры. В центре её находится класс Notifier.
Это активный компонент, в сферу ответственности которого входит координация действий всех остальных объектов по получению, агрегации и доставке данных. Данный класс является кандидатом на реализацию в виде Singleton, так как предполагает некоторую «глобальность». В нём есть основной метод TimerTick, вызываемый внутренним таймером, и осуществляющий один сеанс работы с данными. В данном методе производится опрос поставщиков данных, агрегация результата и передача их на каналы выдачи данных.
За поставку данных отвечает интерфейс ISourceAdapter. В приведённом примере он чрезвычайно прост и имеет всего один метод — «получить данные». Однако, классов, реализующих его, может быть множество. Для случая агрегации данных с нескольких разнородных сайтов, можно написать для каждого сайта свой SourceAdapter. Если сайты достаточно однородны, или предоставляют RSS-рассылку интересующей информации, то можно реализовать один SourceAdapter, использующий XSLT, и просто зарегистировать в Notifier несколько объектов этого класса с разными XSLT-скриптами.
Задача классов-источников, реализующих ISourceAdapter — привести разнородные данные с источников информации к единому формату. Весьма удачным для этого видится XML определённой в рамках прикладных потребностей схемы. Таким образом, внутренним форматом системы удобно выбрать XmlNode для единичного объекта и List[XmlNode] для набора. Хотя никто не мешает и создать для этого бизнес-объект.
После того как данные получены и агрегированы, их нужно доставить потребителю. Эта ответственность лежит на классе Channel, представляющем абстрактный «канал передачи». Это составной объект, делегирующий свои функции своим частям: фильтр определяет, какие из имеющихся в потоке объектов интересуют потребителя, а передатчик — отвечает за доставку выбранной информации конечным пользователям. Это может быть отправка почтового сообщения, вывод в некую очередь на сайте, отправка сообщения по протоколу Jabber или ICQ — и что угодно ещё.
Фильтры представлены классами, реализующими ISourceFilter, столь же простой и полезный интерфейс из одного метода. Для реализации представляется удобным описать условия фильтрации в виде XML-правила, и инициилизировать объект SourceFilter этим правилом, получая таким образом нужное количество разнообразных конфигурируемых фильтров.
Последний важный компонент системы — интерфейс IDestinationAdapter, отвечающий за доставку отобранной информации конечному пользователю. Таких классов может быть опять же много, для всех поддерживаемых протоколов и способов уведомления. Для реализации уведомлений по протоколу Jabber (XMPP) могу порекомендовать удобную библиотеку, снабжённую набором понятных работающих примеров: agsXMPP.
Спасибо за внимание, надеюсь, кому-нибудь пригодится такая архитектура или её часть. :)