1 //but what does it get from EventListener? Nothing!
2 interface ColorListener extends EventListener {
3
4 public void colorChanged (ColorChangeEvent e);
5 }
6
7 interface ColorChanger {
8 public void addColorListener (ColorListener l);
9 public void removeColorListener (ColorListener l);
10 }
11
12 class ColorEventMulticaster implements ColorListener {
13
14 ColorListener a, b;
15
16 ColorEventMulticaster (ColorListener l1, ColorListener l2) {
17 a = l1;
18 b = l2;
19 }
20 ColorEventMulticaster () {
21 Cthulhu.summon (new CthulhuSummoningListener () {
22 //observe the Java capitalization conventions, or English?
23 cthulhuSummoned (CthulhuSummoningEvent e) {
24 ((SunMicrosystemsEmployee) (e.getSource ())).suicide ();
25 }
26 });
27 }
28
29 //OK, I admit I made up the contents of that last method
30 //...
31 //This should probably conform to other Multicaster interface
32 //even though there's not one line of code in common
33 public static synchronized ColorListener add (ColorListener parent, ColorListener child) {
34 if (parent == null) {
35 parent = new ColorEventMulticaster ();
36 }
37 ((ColorEventMulticaster) parent).addColorListener (child);
38 return parent;
39 }
40 public static synchronized ColorListener remove (ColorListener parent, ColorListener child) {
41 if (parent instanceof ColorEventMulticaster) {
42 ((ColorEventMulticaster) parent).removeColorListener (child);
43 }
44 return parent;
45 }
46 public synchronized void addColorListener (ColorListener l) {
47 if (a == null) {
48 a = l;
49 } else if (b == null) {
50 b = l;
51 } else {
52 //a and b are full, fork one.
53 //I think this is a fibonacci tree.
54 if (a instanceof ColorEventMulticaster) {
55 b = new ColorEventMulticaster (b, l);
56 } else {
57 a = new ColorEventMulticaster (a, l);
58 }
59 }
60 }
61 public synchronized void removeColorListener (ColorListener l) {
62
63 if (a == l) {
64 a = null;
65 } else if (a instanceof ColorEventMulticaster) {
66 ((ColorEventMulticaster) a).removeColorListener (l);
67 }
68 if (b == l) {
69 b = null;
70 } else if (b instanceof ColorEventMulticaster) {
71 ((ColorEventMulticaster) b).removeColorListener (l);
72 }
73 }
74
75 public void colorChanged (ColorChangeEvent e) {
76 if (a != null) {
77 a.colorChanged (e);
78 }
79 if (b != null) {
80 b.colorChanged (e);
81 }
82 }
83 }