티스토리 뷰

Observer Pattern


옵저버 패턴은 흔히 신문사 - 구독자 관계로 설명 되곤 합니다.

신문사는 구독자 리스트를 관리하고,

새로운 신문이 발행되면 

새 신문을 모든 구독자에게 전달합니다.

새로운 구독자가 추가될 수도 있고,

기존의 등록 되었던 구독자가 해지될 수도 있습니다.

신문 발행 시에는 그 시점에 등록되어 있는

구독자들에게만 신문을 전달해야 합니다.


신문사 - 구독자 관련 설명은 개념을 이해하기에는 쉽지만,

개발자들이 피부로 와 닿게 느낄만 한 것은 아닌 것 같아

Click Event 발생 시, 다양한 View 객체들에게

이벤트를 전파하는 방식으로 코드를 작성해 보도록 하겠습니다.


Subject Interface는 신문사 역할을 하는 인터페이스로

Observer들을 등록/해지 해주며,

이벤트 발생 시 등록된 Observer들에게 이벤트를 전파해주는 역할을 합니다.

* Subject.java

public interface Subject {
	
	/***
	 * 옵저버 등록
	 */
	public void registerObserver(Observer o);

	/***
	 * 옵저버 해지
	 */
	public void removeObserver(Observer o);
	
	/***
	 * 등록한 모든 옵저버에게 상태 변경 알림
	 */
	public void notifyObservers();
	

}



Observer Interfece는 이벤트를 전파 받을 객체들이 구현해야 할 Interface입니다.

* Observer.java

public interface Observer {

	/***
	 * Subject 상태가 변경 되었을 때 호출
	 */
	public void update();
	
}


이제 Subject, Observer 인터페이스를 구현한 객체를 만들어 보도록 하겠습니다.

우선 View 객체들을 등록/해지해 주고,

Click event 발생 시 등록된 View 객체들에게 이벤트를 전파해주는

ClickEventManager를 만들겠습니다.

이 클래스는 Subject Interface를 구현해야 합니다.

* ClickEventManager

public class ClickEventManager implements Subject {
	
	private List<Observer> observerList = new ArrayList<Observer>();

	@Override
	public void registerObserver(Observer o) {
		observerList.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		observerList.remove(o);
	}

	@Override
	public void notifyObservers() {
		for(Observer o : observerList) {
			o.update();
		}
	}

}


그 다음으로 Observer Interface를 구현한

View 객체들을 만들어 줍니다.

* Layer.java, Window.java, SubmitButton.java

//Layer.java
public class Layer implements Observer {

	@Override
	public void update() {

		System.out.println("레이어A 클릭");
		
	}

}
//Window.java
public class Window implements Observer {

	@Override
	public void update() {
		System.out.println("메인 윈도우 클릭");
	}

}
//SubmitButton.java
public class SubmitButton implements Observer {

	@Override
	public void update() {

		System.out.println("서브밋 버튼 클릭");

	}

}


마지막으로 Test용 Main Class를 만들도록 하겠습니다.

* Main

public class Main { public static void main(String[] args) { ClickEventManager clickEventManager = new ClickEventManager(); System.out.println("옵저버들 등록"); Layer layer = new Layer(); Window window = new Window(); SubmitButton button = new SubmitButton(); clickEventManager.registerObserver(layer); clickEventManager.registerObserver(window); clickEventManager.registerObserver(button); System.out.println("Click Event 발생!!!!"); clickEventManager.notifyObservers(); System.out.println("버튼 옵저버 해지"); clickEventManager.removeObserver(button); System.out.println("Click Event 발생!!!!"); clickEventManager.notifyObservers(); } }



실행 결과는 아래와 같습니다.

옵저버들 등록

Click Event 발생!!!!

레이어A 클릭

메인 윈도우 클릭

서브밋 버튼 클릭

버튼 옵저버 해제

Click Event 발생!!!!

레이어A 클릭

메인 윈도우 클릭 


참고로, Observer Interface를 구현한 클래스가

어떤 Collection을 이용하여 Observer들을 관리하는지

외부에서는 알 수 없기 때문에

이벤트 발생 시 Observer들의 전파 순서는 확신할 수 없다는 것 입니다.




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
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
글 보관함