-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathobserver_patern.rb
74 lines (57 loc) · 2.48 KB
/
observer_patern.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
=begin
Патерн Observer относится к семейству publish/subscribe паттернов
программирования. Observer предоставляет механизм для уведомления
одним объектом другого при изменении собственного состояния.
Объект, который сообщает об изменении своего состояния называется
уведомителем или наблюдаемым объектом, а объекты, которые уведомляются
об изменении состояния уведомителя называются подписчиками
или наблюдателями.
=end
require 'observer'
class Product
include Observable
attr_reader :price
def initialize
@price = 100
end
def set_price
@old_price = @price
@price = 50 + rand(50)
unless @price == @old_price
changed
notify_observers(@price)
end
end
end
class Customer
def initialize(name, good_price, publisher)
@customer = name
@good_price = good_price
publisher.add_observer self
end
def update(price)
unless price > @good_price
puts "#{@customer} buy product for #{price.to_s}$"
end
end
end
product = Product.new
den = Customer.new('Den', 70, product)
leo = Customer.new('Leo', 80, product)
io = Customer.new('Io', 90, product)
product.add_observer den
product.add_observer leo
product.add_observer io
10.times do
product.set_price
puts product.price
end
=begin
#add_observer — метод добавляет подписчика
#notify_observers — метод передает вызывает метод #update объекта — наблюдателя и может передавать в него некоторые значения.
#changed — устанавливает состояние объекта в «измененное». Без вызова этого метода подписчики не получат сообщения об изменениях.
#changed? — проверяет состояние объекта-уведомителя.
#count_observers — метод возвращает количество подписчиков.
#delete_observer — метод удаляет у объекта-уведомителя переданный в качестве аргумента подписчик.
#delete_observers — удаляет все подписчики.
=end