Skip to content

Commit cb40f1c

Browse files
committed
Added example of generic observer
1 parent c231964 commit cb40f1c

File tree

7 files changed

+125
-0
lines changed

7 files changed

+125
-0
lines changed

observer/src/main/java/com/iluwatar/App.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.iluwatar;
22

3+
import com.iluwatar.generic.GHobbits;
4+
import com.iluwatar.generic.GOrcs;
5+
import com.iluwatar.generic.GWeather;
6+
37
/**
48
*
59
* Observer pattern defines one-to-many relationship between objects. The target
@@ -19,5 +23,15 @@ public static void main(String[] args) {
1923
weather.timePasses();
2024
weather.timePasses();
2125

26+
// Generic observer inspired by Java Generics and Collection by Naftalin & Wadler
27+
GWeather gWeather = new GWeather();
28+
gWeather.addObserver(new GHobbits());
29+
gWeather.addObserver(new GOrcs());
30+
31+
gWeather.timePasses();
32+
gWeather.timePasses();
33+
gWeather.timePasses();
34+
gWeather.timePasses();
35+
2236
}
2337
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.iluwatar.generic;
2+
3+
import com.iluwatar.WeatherType;
4+
5+
public class GHobbits implements Race {
6+
@Override
7+
public void update(GWeather o, WeatherType weatherType) {
8+
switch (weatherType) {
9+
case COLD:
10+
System.out.println("The hobbits are shivering in the cold weather.");
11+
break;
12+
case RAINY:
13+
System.out.println("The hobbits look for cover from the rain.");
14+
break;
15+
case SUNNY:
16+
System.out.println("The happy hobbits bade in the warm sun.");
17+
break;
18+
case WINDY:
19+
System.out.println("The hobbits hold their hats tightly in the windy weather.");
20+
break;
21+
default:
22+
break;
23+
}
24+
}
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.iluwatar.generic;
2+
3+
import com.iluwatar.WeatherType;
4+
5+
public class GOrcs implements Race {
6+
@Override
7+
public void update(GWeather weather, WeatherType weatherType) {
8+
switch (weatherType) {
9+
case COLD:
10+
System.out.println("The orcs are freezing cold.");
11+
break;
12+
case RAINY:
13+
System.out.println("The orcs are dripping wet.");
14+
break;
15+
case SUNNY:
16+
System.out.println("The sun hurts the orcs' eyes.");
17+
break;
18+
case WINDY:
19+
System.out.println("The orc smell almost vanishes in the wind.");
20+
break;
21+
default:
22+
break;
23+
}
24+
}
25+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.iluwatar.generic;
2+
3+
import com.iluwatar.WeatherType;
4+
5+
public class GWeather extends Observable<GWeather, Race, WeatherType> {
6+
7+
private WeatherType currentWeather;
8+
9+
public GWeather() {
10+
currentWeather = WeatherType.SUNNY;
11+
}
12+
13+
public void timePasses() {
14+
WeatherType[] enumValues = WeatherType.values();
15+
currentWeather = enumValues[(currentWeather.ordinal() + 1) % enumValues.length];
16+
System.out.println("The weather changed to " + currentWeather + ".");
17+
notifyObservers(currentWeather);
18+
}
19+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.iluwatar.generic;
2+
3+
import java.util.List;
4+
import java.util.concurrent.CopyOnWriteArrayList;
5+
6+
/**
7+
* Generic observer inspired by Java Generics and Collection by Naftalin & Wadler
8+
*
9+
* @param <S> Subject
10+
* @param <O> Observer
11+
* @param <A> Argument type
12+
*/
13+
public abstract class Observable<S extends Observable<S, O, A>, O extends Observer<S, O, A>, A> {
14+
15+
protected List<O> observers;
16+
17+
public Observable() {
18+
this.observers = new CopyOnWriteArrayList<>();
19+
}
20+
21+
public void addObserver(O observer) {
22+
this.observers.add(observer);
23+
}
24+
25+
@SuppressWarnings("unchecked")
26+
public void notifyObservers(A argument) {
27+
for (O observer : observers) {
28+
observer.update((S) this, argument);
29+
}
30+
}
31+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.iluwatar.generic;
2+
3+
public interface Observer<S extends Observable<S, O, A>, O extends Observer<S, O, A>, A> {
4+
public void update(S subject, A argument);
5+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.iluwatar.generic;
2+
3+
import com.iluwatar.WeatherType;
4+
5+
public interface Race extends Observer<GWeather, Race, WeatherType> {
6+
}

0 commit comments

Comments
 (0)