diff options
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/examples/Listing1019.java')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/examples/Listing1019.java | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/examples/Listing1019.java b/Master/Reference Architectures and Patterns/hjp5/examples/Listing1019.java new file mode 100644 index 0000000..4784334 --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/examples/Listing1019.java @@ -0,0 +1,81 @@ +/* Listing1019.java */
+
+interface Observer
+{
+ public void update(Subject subject);
+}
+
+class Subject
+{
+ Observer[] observers = new Observer[5];
+ int observerCnt = 0;
+
+ public void attach(Observer observer)
+ {
+ observers[observerCnt++] = observer;
+ }
+
+ public void detach(Observer observer)
+ {
+ for (int i = 0; i < observerCnt; ++i) {
+ if (observers[i] == observer) {
+ --observerCnt;
+ for (;i < observerCnt; ++i) {
+ observers[i] = observers[i + 1];
+ }
+ break;
+ }
+ }
+ }
+
+ public void fireUpdate()
+ {
+ for (int i = 0; i < observerCnt; ++i) {
+ observers[i].update(this);
+ }
+ }
+}
+
+class Counter
+{
+ int cnt = 0;
+ Subject subject = new Subject();
+
+ public void attach(Observer observer)
+ {
+ subject.attach(observer);
+ }
+
+ public void detach(Observer observer)
+ {
+ subject.detach(observer);
+ }
+
+ public void inc()
+ {
+ if (++cnt % 3 == 0) {
+ subject.fireUpdate();
+ }
+ }
+}
+
+public class Listing1019
+{
+ public static void main(String[] args)
+ {
+ Counter counter = new Counter();
+ counter.attach(
+ new Observer()
+ {
+ public void update(Subject subject)
+ {
+ System.out.print("divisible by 3: ");
+ }
+ }
+ );
+ while (counter.cnt < 10) {
+ counter.inc();
+ System.out.println(counter.cnt);
+ }
+ }
+}
\ No newline at end of file |
