옵저버 패턴(Observer Pattern)에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 상태 변화 알림이 notify 되고, 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 말합니다.
예를 들면, 객체의 상태 변화를 관찰하고 싶은 관찰자들이 있습니다. 그래서 객체를 관찰하기 원하는 이 관찰자들의 옵저버 명단을 객체에 등록하게 됩니다. 이 후 객체가 상태 변화 생기면, 객체는 자신의 상태를 갱신해서 메서드를 통해서 명단에 있는 옵저버들에게 전달하게 됩니다.
1. 첫번째 케이스
interface Observer {
fun receive(msg: String)
}
class Youtube(var observer : Observer) {
fun notifys() {
observer.receive("구독이 완료되었습니다.")
}
}
class Person1 : Observer {
override fun receive(msg: String) {
println(msg)
}
fun subscribe() {
Youtube(this).notifys()
}
}
class Person2 : Observer {
override fun receive(msg: String) {
println(msg)
}
fun subscribe() {
Youtube(this).notifys()
}
}
fun main() {
Person1().subscribe()
Person2().subscribe()
}
출력 결과
구독이 완료되었습니다.
구독이 완료되었습니다.
이 코드는 옵저버 패턴(observer pattern)을 사용하여 Youtube를 구독하는 Person1과 Person2의 상호작용을 보여주는 예입니다. 옵저버 패턴은 객체 사이에서 일대다 의존성을 정의하는 디자인 패턴으로, 한 객체의 상태가 바뀌면 그 객체에 의존하는 모든 객체들에게 알려지고 자동으로 갱신되는 방식입니다.
코드에는 다음과 같은 요소들이 있습니다:
Observer 인터페이스: 이 인터페이스는 'receive'라는 메소드를 정의합니다. 이 메소드는 'msg'라는 문자열을 매개변수로 받아들입니다.
Youtube 클래스: Youtube 클래스는 Observer 인터페이스의 객체를 observer라는 변수로 가지고 있습니다. 이 클래스는 'notifys'라는 메소드를 정의합니다. 이 메소드는 observer의 'receive' 메소드를 호출하며, "구독이 완료되었습니다."라는 메시지를 전달합니다.
Person1 클래스와 Person2 클래스: 두 클래스는 Observer 인터페이스를 구현(implement)하므로 'receive' 메소드를 오버라이드합니다. 이 메소드는 받은 메시지를 출력합니다. 또한 'subscribe'라는 메소드를 정의하는데, 이 메소드는 새로운 Youtube 객체를 생성하고, 'notifys' 메소드를 호출하여 Youtube가 메시지를 보내도록 합니다.
main 함수: main 함수에서는 Person1과 Person2 객체를 생성하고 'subscribe' 메소드를 호출합니다. 이로 인해 각각의 Person 객체는 Youtube에 구독하고, Youtube는 구독이 완료되었다는 메시지를 해당 Person에게 보냅니다.
결과적으로, 이 코드를 실행하면 Person1과 Person2 객체 모두가 "구독이 완료되었습니다."라는 메시지를 출력합니다. 이는 각 객체가 Youtube로부터 알림을 받아 출력하기 때문입니다. 이처럼 옵저버 패턴은 한 객체의 상태 변화를 그 객체에 의존하는 객체들이 알 수 있도록 해줍니다.
2. 두번째 케이스
1. Observer.class
public class Observer {
public String msg;
public void receive(String msg) {
System.out.println(this.msg + "에서 메시지를 받음 : " + msg);
}
}
2. User.class
public class User1 extends Observer {
public User1(String msg) {
this.msg = msg;
}
}
public class User2 extends Observer {
public User2(String msg) {
this.msg = msg;
}
}
3. Notice.class
public class Notice {
private List<Observer> observers = new ArrayList<Observer>();
// 옵저버에 추가
public void attach(Observer observer){
observers.add(observer);
}
// 옵저버에서 제거
public void detach(Observer observer){
observers.remove(observer);
}
// 옵저버들에게 알림
public void notifyObservers(String msg){
for (Observer o:observers) {
o.receive(msg);
}
}
}
4. Main.class
public class Main {
public static void main(String[] args) {
Notice notice = new Notice();
User1 user1 = new User1("유저1");
User2 user2 = new User2("유저2");
notice.attach(user1);
notice.attach(user2);
String msg = "공지사항입니다~!";
notice.notifyObservers(msg);
notice.detach(user1);
msg = "안녕하세요~";
notice.notifyObservers(msg);
}
}
https://ko.wikipedia.org/wiki/%EC%98%B5%EC%84%9C%EB%B2%84_%ED%8C%A8%ED%84%B4
https://coding-factory.tistory.com/710