옵저버 패턴

1 개요[ | ]

observer pattern
옵저버 패턴 [əbzə́ːrvər pǽtərn], 옵서버 패턴, 관찰자 패턴
  • 상태 변화를 알려주도록 하는 디자인 패턴
  • 어떤 일이 생기면 미리 등록한 객체들에게 통보해주는 패턴
  • 옵저버[1]들을 등록해두어 상태변화가 있을 때 통지받는 패턴
  • 객체의 상태 변화를 관찰하는 관찰자들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메소드 등을 통해 객체가 각 Observer에게 통지하도록 하는 디자인 패턴
  • 이벤트 핸들링 시스템 구현에 활용된다.
  • 발행-구독 모델을 따르는 디자인 패턴이다.

Observer.svg

W3sDesign Observer Design Pattern UML.jpg

2 예제[ | ]

import java.util.Observable;
import java.util.Observer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
class EventSource extends Observable implements Runnable {
    public void run() {
        try {
            final InputStreamReader isr = new InputStreamReader(System.in);
            final BufferedReader br = new BufferedReader(isr);
            while (true) {
                String response = br.readLine();
                setChanged();
                notifyObservers(response);
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 
class ResponseHandler implements Observer {
    private String response;
    public void update(Observable obj, Object arg) {
        if (arg instanceof String) {
        	response = (String) arg;
            System.out.print("this.hashCode :" + this.hashCode());
            System.out.println(", Received Response: " + response );
        }
    }
}
 
public class Main {
    public static void main(String[] args) {
        System.out.println("Enter Text >");
 
        EventSource eventSource = new EventSource();
        ResponseHandler responseHandlerA = new ResponseHandler();
        ResponseHandler responseHandlerB = new ResponseHandler();
        eventSource.addObserver(responseHandlerA);
        eventSource.addObserver(responseHandlerB);
 
        Thread thread = new Thread(eventSource);
        thread.start();
    }
}
실행예시
Enter Text >
hello
this.hashCode :1475686616, Received Response: hello
this.hashCode :576315909, Received Response: hello
world
this.hashCode :1475686616, Received Response: world
this.hashCode :576315909, Received Response: world

3 같이 보기[ | ]

4 참고[ | ]

  1. =리스너(listener)
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}