Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit cb40f1c

Browse filesBrowse files
committed
Added example of generic observer
1 parent c231964 commit cb40f1c
Copy full SHA for cb40f1c

7 files changed

+125Lines changed: 125 additions & 0 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

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

Copy file name to clipboardExpand all lines: observer/src/main/java/com/iluwatar/App.java
+14Lines 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
}
Collapse file
+25Lines 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+
}
Collapse file
+25Lines 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+
}
Collapse file
+19Lines 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+
}
Collapse file
+31Lines 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+
}
Collapse file
+5Lines 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+
}
Collapse file
+6Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.