Чтение онлайн

на главную - закладки

Жанры

Программирование на языке 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 эмулирует биржевые котировки с помощью последовательности псевдослучайных чисел (простите мою иронию, но это очень точно соответствует характеру рынка). Символ, идентифицирующий компанию, — всего лишь косметическое украшение, никакого реального смысла в этой программе он не имеет. При каждом изменении цены посылается уведомление всем наблюдателям.

Листинг 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")

Поделиться:
Популярные книги

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес

Матабар. II

Клеванский Кирилл Сергеевич
2. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар. II

Бестужев. Служба Государевой Безопасности. Книга вторая

Измайлов Сергей
2. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга вторая

Обреченное королевство

Сандерсон Брендон
1. The Stormlight Archive
Фантастика:
фэнтези
9.30
рейтинг книги
Обреченное королевство

Варяг

Мазин Александр Владимирович
1. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Варяг

Газлайтер. Том 21

Володин Григорий Григорьевич
21. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 21

Изгой Проклятого Клана. Том 3

Пламенев Владимир
3. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 3

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Архил…? Книга 3

Кожевников Павел
3. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
7.00
рейтинг книги
Архил…? Книга 3

Граф

Ланцов Михаил Алексеевич
6. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Граф

Гримуар темного лорда IX

Грехов Тимофей
9. Гримуар темного лорда
Фантастика:
попаданцы
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда IX

Князь Андер Арес 2

Грехов Тимофей
2. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Андер Арес 2

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

На границе империй. Том 10. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 4