본문 바로가기
Tech/Java

Observer Design Pattern

by Augustine™ 2019. 3. 14.
반응형

Observer Design Pattern


Observer Design Pattern 은 관찰자와 관찰대상으로 분류된다. 이 패턴을 설명하기 위해, 뉴스와 독자의 관계를 예로 들어보자.


  • 독자들은 신문을 읽는다. 

  • 신문은 독자들에게 뉴스를 전해준다.


여기서 독자는 관찰자(Observer)가 되고, 신문은 관찰대상(Observable)이 된다.  굳이 번역하면 관찰자, 관찰대상이지만, 그냥 Observer, Observable 을 그대로 쓰는게 오히려 덜 혼란스러울 것 같다.

Observer은 Observable에게 뭐 새로운 거 없냐고 묻는다. 반면, Observable은 Observer 들에게 새로운 소식이 있으면 새로운 소식을 알려주는 역할을 한다. 이것이 Observer Design Pattern 핵심이다.

Observer Design Pattern은 아래 그림과 같은 형태이다.



Java에서 Observer Design Pattern은 어떻게 동작할까?

Java에서 Observer Design Pattern을 구현하기 위해, 두 개의 Java API를 이해해야 한다. Observable classObserver Interface이다. 

보통 Observer Design Patter을 구현하기 위해, Observable 클래스를 상속하여 사용한다.  이 클래스에서 두 가지 메소드를 기억해야 한다. 하나는 Observable 클래스의 변경여부를 표기하는 setChanged()이고, 다른 하나는 Observer 들에게 소식을 전하는 메소드인 notifyObservers() 이다.

Observer 인터페이스에는 별게 없다. Observable의 소식을 수신하는 update() 메소드밖에 없다. 해당 메소드를 구현하여 사용하면 된다. 다만, update 메소드를 사용하기 위해서, Observable로부터 소식을 수신하겠다는 의미로, Argument로 Observable 을 넣어야 사용할 수 있다. 좀 더 쉬운 이해를 위해 아래 예제를 살펴 보자.


Observer 생성

다음 예제에서 두 명의 신문 독자가 있다. 이 독자들이 Observer들이다. Observer를 구현하기 위해, 독자 클래스는 Observer 인터페이스를 구현할 것이고, Observer 인터페이스의 메소드를 정의할 것이다.

FirstNewsReader.java


package com.augustine.pattern.observer;

import java.util.Observable;
import java.util.Observer;

public class FirstNewsReader implements Observer{

	//Observable의 새로운 뉴스가 있는지 Observer입장에서 업데이트
	//Observable의 상태가 hasChanged가 true일 때, Observable의 뉴스를 수신.
	public void update(Observable obj, Object arg) {
		System.out.println("FirstNewsReader got the news: "+ (String)arg);
	}
}


SecondNewsReader.java


package com.augustine.pattern.observer;

import java.util.Observable;
import java.util.Observer;

public class SecondNewsReader implements Observer{

	public void update(Observable obj, Object arg) {
		System.out.println("SecondNewsReader got the news: "+(String)arg);
	}
}


Observable 생성

News class는 Observerable 클래스를 상속한 것이다. setChanged() 메소드를 통해, 매번 새로운 뉴스가 업데이트 되고 있다는 것을 표시하고, 새로운 뉴스가 있다면, notifyObservers() 메소드를 통해 Observer 들에게 뉴스를 전한다.


News.java


package com.augustine.pattern.observer;

import java.util.Observable;

public class News extends Observable{

	void broadcast() {
		String[] news = {"News Article1", "News Article2", "News Article3"};
		for(String s : news) {
			
			// Observable 이 변경되었다는 걸 표시
			setChanged();
			// Observable 이 변경되었다면, Observer에게 알리자.
			notifyObservers(s);
			try {
				Thread.sleep(1000);
			}catch(InterruptedException e) {
				System.out.println("Error Occurred!!");
			}
		}
	}
}



Observer과 Observable을 실행해보자.

Observer과 Observable을 만들었으니 이제 실행을 해보자. 


ObserverExample.java


package com.augustine.pattern.observer;

public class ObserverExample {

	public static void main(String args[]) {
		News observerdNews = new News();
		FirstNewsReader reader1 = new FirstNewsReader();
		SecondNewsReader reader2 = new SecondNewsReader();
		observerdNews.addObserver(reader1);
		observerdNews.addObserver(reader2);
		observerdNews.broadcast();
	}
}


결과



원문출처 : https://www.concretepage.com/design-pattern/example-observer-design-pattern-java

반응형

'Tech > Java' 카테고리의 다른 글

Factory Design Pattern  (0) 2019.03.18
Singleton Design Pattern  (0) 2019.03.14
Selenium WebDriver  (0) 2019.03.07
Java collection - Set  (0) 2018.05.09
JVM의 메모리 구조  (0) 2018.05.04

댓글