Skip to content

Commit 21c8efa

Browse files
committed
custom observer pattern
1 parent b18417c commit 21c8efa

File tree

6 files changed

+72
-2
lines changed

6 files changed

+72
-2
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package behavioral.observer;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
7+
public class Observable<T> {
8+
9+
private final List<Observer<T>> subscribedObservers = new ArrayList<>();
10+
11+
public void subscribe(Observer<T> observer) {
12+
subscribedObservers.add(observer);
13+
}
14+
15+
@SafeVarargs
16+
public final void subscribe(Observer<T>... observers) {
17+
subscribedObservers.addAll(Arrays.asList(observers));
18+
}
19+
20+
protected void propertyChanged(T source, String propertyName, Object newValue) {
21+
subscribedObservers
22+
.forEach(
23+
observer -> observer.handle(new PropertyChangeEventArgs<>(source, propertyName, newValue))
24+
);
25+
}
26+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package behavioral.observer;
2+
3+
interface Observer<T> {
4+
void handle(PropertyChangeEventArgs<T> args);
5+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package behavioral.observer;
2+
3+
public class ObserverPatternApp {
4+
5+
public static void main(String[] args) {
6+
7+
Observer<Person> ob1 = p -> System.out.println("ob1 consume " + p.source());
8+
Observer<Person> ob2 = p -> System.out.println("ob2 consume " + p.source());
9+
10+
Person p = new Person("Jinhoon", 29);
11+
12+
p.subscribe(ob1, ob2);
13+
14+
p.setAge(30);
15+
p.setAge(31);
16+
}
17+
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package behavioral.observer;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.ToString;
5+
6+
@ToString
7+
@AllArgsConstructor
8+
class Person extends Observable<Person>{
9+
private final String name;
10+
private int age;
11+
12+
public void setAge(int age) {
13+
if (this.age != age) {
14+
this.age = age;
15+
propertyChanged(this, "age", age);
16+
}
17+
}
18+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package behavioral.observer;
2+
3+
record PropertyChangeEventArgs<T> (T source, String propertyName, Object newValue) {}

src/main/java/concurrency/reactive/Ob.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ public void run() {
7070
@AllArgsConstructor
7171
static class Person extends RunnableObservable {
7272

73-
String name;
74-
int age;
73+
private final String name;
74+
private int age;
7575

7676
void setAge(int newAge) {
7777
if (this.age != newAge) {

0 commit comments

Comments
 (0)