-
[디자인 패턴] 옵저버 패턴 (Observer Pattern)Computer Science/Design Pattern 2022. 12. 13. 16:51반응형
옵저버 패턴이란?
: 주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴
- 주체: 객체의 상태 변화를 보고 있는 관찰자
- 옵저버: 객체의 상태 변화에 따라 전달되는 메서드 등을 기반으로 '추가 변화 사항'이 생기는 객체- 한 객체의 상태 변화에 따라 다른 객체 상태도 연동되도록 1:N 의존 관계를 구성
- Java는 기본적으로 옵저버 패턴을 적용한 Observer 인터페이스, Observable 클래스를 제공 (Observable은 상속을 해야하기 때문에 다른 상속을 함께 사용할 수 없는 단점 존재)[ 구현 방법 ]
interface Subject { public void register(Observer obj); public void unregister(Observer obj); public void notifyObservers(); public Object getUpdate(Observer obj); } interface Observer { public void update(); } // 주체이자 객체 class Topic implements Subject { private List<Observer> observers; private String message; public Topic() { this.observers = new ArrayList<>(); this.message = ""; } @Override public void register(Observer obj) { if(!observers.contains(obj)) observers.add(obj); } @Override public void unregister(Observer obj) { observers.remove(obj); } @Override public void notifyObservers() { this.observers.forEach(Observer::update); } @Override public Object getUpdate(Observer obj) { return this.message; } public void postMessage(String msg) { System.out.println("Message send to Topic: " + msg); this.message = msg; notifyObservers(); } } class TopicSubscriber implements Observer { private String name; private Subject topic; public TopicSubscriber(String name, Subject topic) { this.name = name; this.topic = topic; } @Override public void update() { String msg = (String) topic.getUpdate(this); System.out.println(name + ":: got message >> " + msg); } } public class Test { public static void main(String[] args) { Topic topic = new Topic(); Observer a = new TopicSubscriber("a", topic); Observer b = new TopicSubscriber("b", topic); Observer c = new TopicSubscriber("c", topic); topic.register(a); topic.register(b); topic.register(c); topic.postMessage("hello!"); } } /* * 객체가 변경될 때마다 작동! */
반응형'Computer Science > Design Pattern' 카테고리의 다른 글
[디자인 패턴] 이터레이터 패턴 (Iterator Pattern) (0) 2022.12.14 [디자인 패턴] 프록시 패턴 (Proxy Pattern) (0) 2022.12.13 [디자인 패턴] 전략 패턴 (Strategy Pattern) (0) 2022.12.13 [디자인 패턴] 팩토리 패턴 (factory pattern) (0) 2022.12.13 [디자인 패턴] 싱글톤 패턴(Singleton Pattern) (0) 2022.12.12