Программирование на языке Ruby
Шрифт:
В листинге 20.1 наблюдатель определен как объект, отвечающий на вызов метода update. Сервер добавляет наблюдателей по их просьбе и посылает им уведомления, обращаясь к методу
notify_observers
. Листинг 20.1. Модуль DrbObservable
module DRbObservable
def add_observer(observer)
@observer_peers ||= []
unless observer.respond_to? :update
raise NameError, "наблюдатель должен отвечать на вызов 'update'"
end
@observer_peers.push observer
end
def delete_observer(observer)
@observer_peers.delete observer if defined? @observer_peers
end
def notify_observers(*arg)
return unless defined? @observer_peers
for i in @observer_peers.dup
begin
i.update(*arg)
rescue
delete_observer(i)
end
end
end
end
Сервер (он
Листинг 20.2. Канал биржевых котировок (drb-сервер)
require "drb"
require "drb_pbserver"
# Генерировать случайные котировки.
class MockPrice
MIN = 75
RANGE = 50
def initialize(symbol)
@price = RANGE / 2
end
def price
@price += (rand - 0.5)*RANGE
if @price < 0
@price = -@price
elsif @price >= RANGE
@price = 2*RANGE - @price
end
MIN + @price
end
end
class Ticker # Периодически получать котировку акций.
include DRbObservable
def initialize(price_feed)
@feed = price_feed
Thread.new { run }
end
def run
lastPrice = nil
loop do
price = @feed.price
print "Текущая
котировка: #{price}\n"
if price != lastPrice
lastPrice = price
notify_observers(Time.now, price)
end
sleep 1
end
end
end
ticker = Ticker.new(MockPrice.new("MSFT"))
DRb.start_service('druby://localhost:9001', ticker)
puts 'Нажмите [return] для завершения.'
gets
На платформе Windows примененный способ завершения программы вызывает сложности. Функция
gets
в этом случае может блокировать главный поток. Если вы это видите, попробуйте вместо обращения к gets
поставить DRb.thread.join
(а завершайте программу нажатием Ctrl+C). Неудивительно, что клиент (листинг 20.3) начинает с установления соединения с сервером. Он получает ссылку на объект показа котировок и устанавливает верхний и нижний пороги изменения цены. Затем клиент выводит сообщение пользователю всякий раз, как цена выходит за пределы указанного диапазона.
Листинг 20.3. Наблюдатель биржевых котировок (drb-клиент)
require "drb"
class Warner
include DRbUndumped
def initialize(ticker, limit)
@limit = limit
ticker.add_observer(self) # Любой объект Warner
# является наблюдателем.
end
end
class WarnLow < Warner
def update(time, price) # Обратный вызов наблюдателя.
if price < @limit
print "--- #{time.to_s}: Цена ниже #@limit: #{price}\n"
end
end
end
class WarnHigh < Warner
def update(time, price) # Обратный вызов наблюдателя.
if price > @limit
print "+++ #{time.to_s}: Цена выше #@limit: #{price}\n"
end
end
end
DRb.start_service
ticker = DRbObject.new(nil, "druby://localhost:9001")
Поделиться:
Популярные книги
Инженер Петра Великого 3
3. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Мы – Гордые часть 8
8. Стальные яйца
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 9
9. Как я строил магическую империю
Фантастика:
постапокалипсис
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Романов. Том 1 и Том 2
1. Романов
Фантастика:
фэнтези
попаданцы
альтернативная история
5.25
рейтинг книги
Кукловод
2. О чем молчат могилы
Фантастика:
боевая фантастика
8.50
рейтинг книги
Хозяин Теней 5
5. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Телохранитель Генсека. Том 2
2. Медведев
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Позывной "Князь" 4
4. Князь Эгерман
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Беглец
15. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Ружемант 5
5. Ружемант
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Протокол "Наследник"
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
На границе империй. Том 9. Часть 4
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Второгодка. Книга 2. Око за око
2. Второгодка
Фантастика:
героическая фантастика
альтернативная история
фэнтези
5.00
рейтинг книги
Любовь Носорога
Любовные романы:
современные любовные романы
9.11