디자인 패턴/행위 패턴

옵저버 패턴 (Observer Pattern)

MinsooLee 2021. 8. 29. 20:39

1. 옵저버 패턴이란?

  • 어떤 객체의 상태가 변할 때 그와 연관된 객체들에게 알림을 보내는 디자인 패턴
  • 야자시간에 밖에서 선생님이 오는지 살펴보는 학생을 생각하면 이해가 쉬움

 


 

2. 옵저버 패턴의 예시

Apple 제품을 사용하고 있는 사람들에게 공지사항(이벤트 발생)을 알려주는 시스템이다.

User 클래스

public class User {
	public String name;
    
	public void getMsg(String msg) {
		System.out.println(this.name + "가 메세지 수신: " + msg);
	}
}

사용자 Minsoo, Cheolsu 클래스

public class Minsoo extends User {
	public Minsoo(String name) {
		this.name = name;
	}
}

public class Cheolsu extends User {
	public Cheolsu(String name) {
		this.name = name;
	}
}

Apple 클래스 (옵저버(여기서는 User)들에게 알림을 전달)

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

public class Apple {
	public ArrayList<User> users = new ArrayList<User>();

	// 애플 알림을 구독하는 사람 추가
	public void subscribe(User user) {
		users.add(user);
	}

	// 애플 알림을 구독취소한 사람은 명단에서 제거
	public void unsubscribe(User user) {
		users.remove(user);
	}

	public void notice(String msg) {
		for (User user: users) {
			user.getMsg(msg);
		}
	}
}

Main 클래스

public class Main {
	public static void main(String[] args) {
		Apple apple = new Apple();
		Minsoo minsoo = new Minsoo("민수");
		Cheolsu cheolsu = new Cheolsu("철수");
		
		apple.subscribe(minsoo);
		apple.subscribe(cheolsu);
        // 민수, 철수가 애플 구독
		
		String msg = "아이폰미니 출시";
		apple.notice(msg);
		
		apple.unsubscribe(cheolsu);
        // 철수가 애플 구독취소
        
		msg = "아이폰12 출시";
		apple.notice(msg);
	}
}

// 출력
// 민수가 메세지 수신: 아이폰미니 출시
// 철수가 메세지 수신: 아이폰미니 출시
// 민수가 메세지 수신: 아이폰12 출시