티스토리 뷰
옵저버 패턴(observer pattern)
주체(Subject, 관찰자)가 옵저버 또는 리스너(listener)라 불리는 하나 이상의 객체를 관찰 대상이 되는 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다.
발행/구독 모델로 알려져있기도 하다.
이 옵저버 패턴을 활용한 서비스로는 대표적으로 트위터가 있다.
면접을 위한 CS 전공 지식 노트 예제에서는 topic(주체 ≒ 객체)을 기반으로 옵저버 패턴을 구현한 예제가 나와있다.
/*
면접을 위한 cs 전공 지식 노트 예제
4. Observer pattern
하나 이상의 객체를 관찰 대상이 되는 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해
옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴
*/
import java.util.ArrayList;
import java.util.List;
interface Subject {
public void register(Observer obj);
public void unregister(Observer obj);
public void notifyObservers();
public Object getUpdate(Observer obj);
}
interface Observer {
public void update();
}
// 구현 부모 클래스의 메서드를 재정의하여 구현해야함
class Topic implements Subject {
private List<Observer> observers;
private String message;
public Topic() {
this.observers = new ArrayList<>();
this.message = "";
}
@Override
public void register(Observer obj) {
if (!observers.contains(obj)) observers.add(obj);
}
@Override
public void unregister(Observer obj) {
observers.remove(obj);
}
@Override
public void notifyObservers() {
this.observers.forEach(Observer::update);
}
@Override
public Object getUpdate(Observer obj) {
return this.message;
}
public void postMessage(String msg) {
System.out.println("Message sended to Topic: " + msg);
this.message = msg;
notifyObservers();
}
}
class TopicSubscriber implements Observer {
private String name;
private Subject topic;
public TopicSubscriber(String name, Subject topic) {
this.name = name;
this.topic = topic;
}
@Override
public void update() {
String msg = (String) topic.getUpdate(this);
System.out.println(name + ":: got message >> " + msg);
}
}
public class ObserverPattern {
public static void main(String[] args) {
Topic topic = new Topic();
Observer a = new TopicSubscriber("a", topic);
Observer b = new TopicSubscriber("b", topic);
Observer c = new TopicSubscriber("c", topic);
topic.register(a);
topic.register(b);
topic.register(c);
topic.postMessage("amumu is op champion!!");
}
}
/* 실행 결과값
Message sended to Topic: amumu is op champion!!
a:: got message >> amumu is op champion!!
b:: got message >> amumu is op champion!!
c:: got message >> amumu is op champion!!
*/
'study > Web' 카테고리의 다른 글
디자인 패턴 - 반복자 패턴(iterator pattern) (0) | 2022.10.23 |
---|---|
디자인 패턴 - 프록시 패턴(proxy pattern) (0) | 2022.10.20 |
디자인 패턴 - 전략 패턴(strategy pattern) (0) | 2022.10.13 |
디자인 패턴 - 팩토리 패턴 (factory pattern) (0) | 2022.10.06 |
디자인 패턴 - 싱글톤 패턴 (singleton pattern) (0) | 2022.10.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Python
- python3
- django.contrib.auth
- musma
- 회원 로그인
- 웹페이지
- Java
- 혼자 공부하는 파이썬
- 커맨드 객체
- 면접을 위한 CS 전공 지식 노트
- Django tutorial
- git
- 한글 형태소 분석기
- django-environ
- git 공부
- 회원가입
- 검색 결과 내 페이지네이션
- git공부
- 암호화
- path variable
- Spring
- django
- Magazine K
- error: failed to push some refs to 'https://github.com/
- authenticate()
- API
- 배열
- 톰캣
- 디자인 패턴
- 환경 변수 설정
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함