Untitled
unknown
plain_text
2 years ago
3.6 kB
2
Indexable
// Базовый класс-издатель. Содержит код управления подписчиками // и их оповещения. class EventManager is private field listeners: hash map of event types and listeners method subscribe(eventType, listener) is listeners.add(eventType, listener) method unsubscribe(eventType, listener) is listeners.remove(eventType, listener) method notify(eventType, data) is foreach (listener in listeners.of(eventType)) do listener.update(data) // Конкретный класс-издатель, содержащий интересную для других // компонентов бизнес-логику. Мы могли бы сделать его прямым // потомком EventManager, но в реальной жизни это не всегда // возможно (например, если у класса уже есть родитель). Поэтому // здесь мы подключаем механизм подписки при помощи композиции. class Editor is public field events: EventManager private field file: File constructor Editor() is events = new EventManager() // Методы бизнес-логики, которые оповещают подписчиков об // изменениях. method openFile(path) is this.file = new File(path) events.notify("open", file.name) method saveFile() is file.write() events.notify("save", file.name) // ... // Общий интерфейс подписчиков. Во многих языках, поддерживающих // функциональные типы, можно обойтись без этого интерфейса и // конкретных классов, заменив объекты подписчиков функциями. interface EventListener is method update(filename) // Набор конкретных подписчиков. Они реализуют добавочную // функциональность, реагируя на извещения от издателя. class LoggingListener implements EventListener is private field log: File private field message: string constructor LoggingListener(log_filename, message) is this.log = new File(log_filename) this.message = message method update(filename) is log.write(replace('%s',filename,message)) class EmailAlertsListener implements EventListener is private field email: string private field message: string constructor EmailAlertsListener(email, message) is this.email = email this.message = message method update(filename) is system.email(email, replace('%s',filename,message)) // Приложение может сконфигурировать издателей и подписчиков как // угодно, в зависимости от целей и окружения. class Application is method config() is editor = new Editor() logger = new LoggingListener( "/path/to/log.txt", "Someone has opened file: %s"); editor.events.subscribe("open", logger) emailAlerts = new EmailAlertsListener( "admin@example.com", "Someone has changed the file: %s") editor.events.subscribe("save", emailAlerts)
Editor is loading...
Leave a Comment