티스토리 뷰
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들의 전파 순서는 확신할 수 없다는 것 입니다.
'개발 > Java' 카테고리의 다른 글
디자인 패턴 - Decorator Pattern (0) | 2016.03.10 |
---|---|
java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig (0) | 2016.03.08 |
Maven을 이용하여 실행 가능한 jar 만들기 (0) | 2016.03.04 |
Maven 테스트 스킵 후 패키징 하기 (0) | 2016.03.03 |
1의 개수가 하나 이상인지 여부를 체크하는 비트연산 (0) | 2016.02.22 |