티스토리 뷰
들어가는말
N/A
요약
observer 가 관찰자라서 능동인 것처럼 느껴지지만 결국 행위를 수신하는 피동적 대상이다. (이벤트 구독)
능동적으로 observer 들을 관리하고 통보하는 행위는 observable (이벤트 발생) 이 수행한다.
observable 이 observer 들을 관리하는 건 deprecated 된 java.util.Observable에 의존할 수도 있고 list 로도 사용할 수 있다
사족: depreacated 된 이유는 Observable이 Serializable를 implements 하지 않은 것이랑 thread safety 가 보장되지 않는다는 것이다 (이건 잘 안 와닿기는 하는데)
뭐 거기다 9 에서는 Flow API 가 나오기도 했고
Observer is deprecated in Java 9. What should we use instead of it?
Java 9 came out, and Observer has been deprecated. Why is that? Does it mean that we shouldn't implement observer pattern anymore? It would be good to know what is a better alternative?
stackoverflow.com
패턴에서는 observable 은 subject라는 명칭으로도 불린다. (행위 컨셉은 동일하다)
observer는 약속된 수신 인터페이스(콜백)를 구현하면 된다. (그럼 observable 이 사전에 정의된 대로 처리해줄 테니)
출처
https://www.baeldung.com/java-observer-pattern
샘플
package me.xep;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class Observer {
//observable
public static class NewsAgency {
private String news;
private List<Channel> channelList = new ArrayList<>();
public void addObserver(Channel channel) {
this.channelList.add(channel);
}
public void removeObserver(Channel channel) {
this.channelList.remove(channel);
}
public void setNews(String news) {
this.news = news;
for (Channel channel : channelList) {
channel.update(news);
}
}
}
//observer
public static class NewsChannel implements Channel {
public String news;
public String getNews() {
return news;
}
@Override
public void update(Object news) {
this.news = (String) news;
}
}
public interface Channel {
void update(Object o);
}
@Test
public void test() {
NewsAgency observable = new NewsAgency();
NewsChannel observer = new NewsChannel();
observable.addObserver(observer);
observable.setNews("news");
assert observer.getNews().contentEquals("news");
}
}
package me.xep;
import org.junit.Test;
import java.util.Observable;
import java.util.Observer;
public class Observer2 {
public static class NewsChannel implements Observer {
private String news;
public String getNews() {
return news;
}
@Override
public void update(Observable o, Object arg) {
this.news = (String) arg;
}
}
public static class NewsAgency extends Observable {
private String news;
public void setNews(String news) {
this.news = news;
setChanged();
notifyObservers(news);
}
}
@Test
public void test() {
NewsChannel observer = new NewsChannel();
NewsAgency observable = new NewsAgency();
observable.addObserver(observer);
observable.setNews("news");
assert observer.getNews().contentEquals("news");
}
}
'개발관련 > 뻘팁-작업노트' 카테고리의 다른 글
jackson 분석 - 작업 노트 (0) | 2021.08.08 |
---|---|
JHipster (맛보기 + 소견) (0) | 2021.05.11 |
java - java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0 (0) | 2021.05.10 |
reactor - groupedFlux 의 키 개수 제한 (0) | 2021.04.29 |
CompletableFuture async (0) | 2021.04.06 |
- Total
- Today
- Yesterday
- 기술센싱
- 만들면서 배우는 클린 아키텍처
- COMMIT
- 기술블로그
- AWS
- percolate
- Spring
- PatternSyntaxException
- jhipster
- Kafka
- 기술사이트
- WebSocket
- 에픽테토스
- Dangling
- meta character
- 말의품격
- flush
- opensearch
- pecs
- Java
- 개발자
- kafka 2.8.0
- 클린 아키텍처
- elasticsearch
- Generic
- Async
- 사기꾼증후군
- completablefuture
- 전설로떠나는월가의영웅
- fsync
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |