-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathObserver.vb
81 lines (77 loc) · 2.54 KB
/
Observer.vb
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
75
76
77
78
79
80
81
Module Observer
' Observer Design Pattern.
' See description in http://www.vb-net.ru/ProgramTheory/Observer.htm
Class MainApp
' Entry point into console application.
Public Shared Sub Main()
' Configure Observer pattern
Dim s As New ConcreteSubject()
s.Attach(New ConcreteObserver(s, "X"))
s.Attach(New ConcreteObserver(s, "Y"))
s.Attach(New ConcreteObserver(s, "Z"))
' Change subject and notify observers
s.SubjectState = "ABC"
s.Notify()
' Wait for user
Console.ReadKey()
End Sub
End Class
' The 'Subject' abstract class
MustInherit Class Subject
Private _observers As New List(Of Observer)()
Public Sub Attach(observer As Observer)
_observers.Add(observer)
End Sub
Public Sub Detach(observer As Observer)
_observers.Remove(observer)
End Sub
Public Sub Notify()
For Each o As Observer In _observers
o.Update()
Next
End Sub
End Class
' The 'ConcreteSubject' class
Class ConcreteSubject
Inherits Subject
Private _subjectState As String
' Gets or sets subject state
Public Property SubjectState() As String
Get
Return _subjectState
End Get
Set(value As String)
_subjectState = value
End Set
End Property
End Class
' The 'Observer' abstract class
MustInherit Class Observer
Public MustOverride Sub Update()
End Class
' The 'ConcreteObserver' class
Class ConcreteObserver
Inherits Observer
Private _name As String
Private _observerState As String
Private _subject As ConcreteSubject
' Constructor
Public Sub New(subject As ConcreteSubject, name As String)
Me._subject = subject
Me._name = name
End Sub
Public Overrides Sub Update()
_observerState = _subject.SubjectState
Console.WriteLine("Observer {0}'s new state is {1}", _name, _observerState)
End Sub
' Gets or sets subject
Public Property Subject() As ConcreteSubject
Get
Return _subject
End Get
Set(value As ConcreteSubject)
_subject = value
End Set
End Property
End Class
End Module