Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- QueryDSL
- 스프링
- kotlin
- JDBC
- AOP
- 김영한
- jpa
- Servlet
- 인프런
- JPQL
- Thymeleaf
- Greedy
- 스프링 핵심 기능
- db
- 백준
- pointcut
- java
- transaction
- Exception
- Proxy
- Spring Boot
- 자바
- 스프링 핵심 원리
- Android
- SpringBoot
- http
- 알고리즘
- 그리디
- spring
- springdatajpa
Archives
- Today
- Total
개발자되기 프로젝트
Observer Pattern 본문
1. Observer Pattern??
- 객체 사이에 일대다의 의존 관계가 있고, 어떤 객체의 상태가 변하게 되면, 그 객체에 의존성을 가진 다른 객체들이 변화에 통지(notiry or update)를 받고 자동으로 갱신될 수 있게 함.
- dependent, publish-subscribe
2. 의도와 동기
- 하나의 객체에 연동되는 여러 객체 집합이 있을 때 변화에 대한 일관성은 유지하고, 객체간의 결합도는 낮게하기 위한 패턴
- 변화에 관심이 있는 개체에 대한 가정없이 통보될 수 있도록 해야함.
- 주오 data-view의 관계에서 사요오딤
- log와 그 handler들의 관계(file, console 등등)
3. Class diagram
4. 객체 협력 (collaborations)
- Subject : Observer를 알고 있는 주체, Observer를 더하거나 뺄수 있음
- Observer : Subject의 변화에 관심을 가지는 객체, 갱신에 필요한 인터페이스 정의, 객체들의 일관성을 유지
- ConcreteSubject : ConcreteObserver에게 알려주어야하는 상태가 변경될때 통보 (주로 List로 Observer관리)
- ConcreteObserver : 객체에 대한 참조자를 관리하고, Subject의 일관성 유지하며, Subject가 변경될 때 갱신되는 인터페이스 구현
5. 중요한 결론 (consequence)
- Subject와 Observer간의 추상적인 결합만의 존재
- BroadCast 방식의 교류가 가능
- 데이타와 그 뷰 사이에 자주 사용되는 방법
6. 예제
- NumberGenerator를 실행하면 반복문을 돌면서 랜덤 숫자를 생성한다.
- NumberGenerator는 List로 Observer를 가지고 있음.
- 숫자를 생성 후에 Observer에 notify를 날린다. 날릴 때 Generator를 넣어서 날림.
- 각 Observer는 넘어온 Generator를 가지고 메서드를 실행.
- 즉 어떤 객체에 변경이 생기거나 특정 메서드가 실행되면 Observer의 특정 메서드가 실행됨.
public abstract class NumberGenerator {
List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer){
observers.add(observer);
}
public void removeObserver(Observer observer){
observers.remove(observer);
}
public void notifyObservers(){
Iterator<Observer> iterator = observers.iterator();
while (iterator.hasNext()){
Observer observer = iterator.next();
observer.update(this);
}
}
public abstract int getNumber();
public abstract void execute();
}
public class RandomNumberGenerator extends NumberGenerator{
private Random random = new Random();
private int number;
@Override
public int getNumber() {
return number;
}
@Override
public void execute() {
for (int i=0; i<50; i++){
number = random.nextInt(50);
notifyObservers();
}
}
}
public interface Observer {
public void update(NumberGenerator generator);
}
public class GraphObserver implements Observer{
@Override
public void update(NumberGenerator generator) {
System.out.println("GraphObserver");
int number = generator.getNumber();
for (int i=0; i < number; i++){
System.out.print("*");
}
System.out.println();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class DigitObserver implements Observer {
@Override
public void update(NumberGenerator generator) {
System.out.println("DigitObserver" + generator.getNumber());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
NumberGenerator generator = new RandomNumberGenerator();
Observer observer1 = new DigitObserver();
Observer observer2 = new GraphObserver();
generator.addObserver(observer1);
generator.addObserver(observer2);
generator.execute();
}
}
7. GitHub : 211111 Observer Pattern
'Java > 디자인 패턴' 카테고리의 다른 글
복잡한 연결을 단순하게 - Facade Pattern (0) | 2021.11.12 |
---|---|
Memento Pattern (0) | 2021.11.11 |
조건에 따른 상태를 클래스로 표현하여 관리 - State (0) | 2021.11.10 |
Adapter Pattern (0) | 2021.11.09 |
Composite Pattern (0) | 2021.11.09 |
Comments