"옵저버 패턴"의 두 판 사이의 차이

11번째 줄: 11번째 줄:
==예제==
==예제==
<source lang='java'>
<source lang='java'>
import java.util.Observable;
import java.util.Observer;
import java.io.BufferedReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStreamReader;
   
   
public class EventSource extends Observable implements Runnable {
class EventSource extends Observable implements Runnable {
     public void run() {
     public void run() {
         try {
         try {
31번째 줄: 33번째 줄:
     }
     }
}
}
 
public class ResponseHandler implements Observer {
class ResponseHandler implements Observer {
     private String resp;
     private String response;
     public void update(Observable obj, Object arg) {
     public void update(Observable obj, Object arg) {
         if (arg instanceof String) {
         if (arg instanceof String) {
            resp = (String) arg;
        response = (String) arg;
             System.out.println("\nReceived Response: " + resp );
            System.out.print("Object Hash code:" + this.hashCode());
             System.out.println(", Received Response: " + response );
         }
         }
     }
     }
}
}
 
public class MyApp {
public class Main {
     public static void main(String[] args) {
     public static void main(String[] args) {
         System.out.println("Enter Text >");
         System.out.println("Enter Text >");
   
   
         // create an event source - reads from stdin
         EventSource eventSource = new EventSource();
        final EventSource eventSource = new EventSource();
        ResponseHandler responseHandlerA = new ResponseHandler();
        ResponseHandler responseHandlerB = new ResponseHandler();
        eventSource.addObserver(responseHandlerA);
        eventSource.addObserver(responseHandlerB);
   
   
        // create an observer
        final ResponseHandler responseHandler = new ResponseHandler();
        // subscribe the observer to the event source
        eventSource.addObserver(responseHandler);
        // starts the event thread
         Thread thread = new Thread(eventSource);
         Thread thread = new Thread(eventSource);
         thread.start();
         thread.start();
     }
     }
}
}
</source>
;실행예시
<source lang'text'>
Enter Text >
hello
Object Hash code:576315909, Received Response: hello
Object Hash code:990234593, Received Response: hello
world
Object Hash code:576315909, Received Response: world
Object Hash code:990234593, Received Response: world
</source>
</source>



2013년 2월 26일 (화) 00:22 판

1 개요

observer pattern
옵저버 패턴
  • 상태 변화를 알려주도록 하는 패턴
  • 어떤 일이 생기면 미리 등록한 객체들에게 통보해주는 패턴
  • 옵저버[1]들을 등록해두어 상태변화가 있을 때 통지받는 패턴
  • 발행-구독 모델을 따르는 디자인 패턴

Observer.svg

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("Object Hash code:" + 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
Object Hash code:576315909, Received Response: hello
Object Hash code:990234593, Received Response: hello
world
Object Hash code:576315909, Received Response: world
Object Hash code:990234593, Received Response: world

3 같이 보기

4 주석

  1. =리스너(listener)

5 참고 자료