-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathObserver.java
More file actions
125 lines (94 loc) · 2.91 KB
/
Observer.java
File metadata and controls
125 lines (94 loc) · 2.91 KB
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import static org.junit.Assert.assertEquals;
import java.io.Closeable;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
class Event<T> {
private int count = 0;
private Map<Integer, Consumer<T>> handlers = new HashMap<>();
public Subscription addHandler(Consumer<T> handler) {
int i = count;
handlers.put(count++, handler);
return new Subscription(this, i);
}
public void fire(T args) {
for (Consumer<T> handler : handlers.values())
handler.accept(args);
}
public class Subscription implements AutoCloseable {
private Event<T> event;
private int id;
public Subscription(Event<T> event, int id) {
this.event = event;
this.id = id;
}
@Override
public void close() /* throws Exception */
{
event.handlers.remove(id);
}
public void fire(T args) {
Event.this.fire(args);
}
}
}
class Game {
Event<Rat> eventEnter = new Event<>();
Event<Rat> eventLeave = new Event<>();
Event<Rat> eventPing = new Event<>();
}
class Rat implements Closeable {
public int attack = 1;
private Event<Rat>.Subscription addHandler;
private Event<Rat>.Subscription leaveHandler;
private Event<Rat>.Subscription pingHandler;
public Rat(Game game) {
addHandler = game.eventEnter.addHandler(o -> {
if (o != this) {
++attack;
}
});
leaveHandler = game.eventLeave.addHandler(o -> {
if (o != this) {
--attack;
}
});
pingHandler = game.eventPing.addHandler(o -> {
if (o != this) {
o.attack++;
}
});
pingHandler.fire(this);
addHandler.fire(this);
}
@Override
public void close()
throws IOException {
leaveHandler.fire(this);
addHandler.close();
leaveHandler.close();
}
}
class DemoObserver {
public static void main(String[] args)
throws IOException {
Game game = new Game();
try (Rat rat1 = new Rat(game)) {
assertEquals(1, rat1.attack);
try (Rat rat2 = new Rat(game)) {
assertEquals(2, rat1.attack);
assertEquals(2, rat2.attack);
try (Rat rat3 = new Rat(game)) {
assertEquals(3, rat1.attack);
assertEquals(3, rat2.attack);
assertEquals(3, rat3.attack);
}
assertEquals(2, rat1.attack);
assertEquals(2, rat2.attack);
}
assertEquals(1, rat1.attack);
}
System.out.println("success");
}
}