옵저버 패턴

DEV_HOYA·2023년 10월 19일
0

CS

목록 보기
17/55
post-thumbnail

📌 옵저버 패턴(Observer)

⭐ 개념

  • 어떤 객체(subject)의 상태 변화를 관찰하다가 상태 변화가 있을때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려 주는 디자인 패턴
  • 트위터, MVC패턴에도 사용됨

⭐ 코드

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

public class Main {
	public static void main(String[] args) {
		Topic topic = new Topic();
		Observer a = new TopicSubscriber("a", topic);
		Observer b = new TopicSubscriber("b", topic);
		topic.register(a);
		topic.register(b);
		topic.postMessage("슬의생 티저 올림 ㅎ");
	}
}
interface Subject {
	public void register(Observer obj);
	public void unregister(Observer obj);
	public void notifyObservers();
	public Object getUpdate(Observer obj);
}
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();
	}
}
interface Observer {
	public void update();
}
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 + "님이 받은 메세지 : " + msg);
	}
}
/*
Message sended to Topic: 슬의생 티저 올림 ㅎ
a님이 받은 메세지 : 슬의생 티저 올림 ㅎ
b님이 받은 메세지 : 슬의생 티저 올림 ㅎ
*/

0개의 댓글