옵저버 패턴

이강용·2024년 3월 10일
0

CS

목록 보기
31/109

옵저버 패턴이란

  • 주체가 어떤 객체(subject)의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴
    👉🏻 트위터의 메인 로직 그리고 MVC 패턴에도 적용되어 있음
package programmers;

import java.util.ArrayList;
import java.util.List;

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 sended 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 HelloWorld {
	
	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("Success");
	}

}

profile
HW + SW = 1

0개의 댓글