옵저버 패턴 (Observer Pattern)

쓰리원·2022년 5월 30일
0

디자인패턴

목록 보기
4/4
post-thumbnail

1. 옵저버 패턴(Observer Pattern)이란?

옵저버 패턴(Observer Pattern)에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 상태 변화 알림이 notify 되고, 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 말합니다.

예를 들면, 객체의 상태 변화를 관찰하고 싶은 관찰자들이 있습니다. 그래서 객체를 관찰하기 원하는 이 관찰자들의 옵저버 명단을 객체에 등록하게 됩니다. 이 후 객체가 상태 변화 생기면, 객체는 자신의 상태를 갱신해서 메서드를 통해서 명단에 있는 옵저버들에게 전달하게 됩니다.

2. 옵저버 패턴 구현

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의 상호작용을 보여주는 예입니다. 옵저버 패턴은 객체 사이에서 일대다 의존성을 정의하는 디자인 패턴으로, 한 객체의 상태가 바뀌면 그 객체에 의존하는 모든 객체들에게 알려지고 자동으로 갱신되는 방식입니다.

코드에는 다음과 같은 요소들이 있습니다:

  1. Observer 인터페이스: 이 인터페이스는 'receive'라는 메소드를 정의합니다. 이 메소드는 'msg'라는 문자열을 매개변수로 받아들입니다.

  2. Youtube 클래스: Youtube 클래스는 Observer 인터페이스의 객체를 observer라는 변수로 가지고 있습니다. 이 클래스는 'notifys'라는 메소드를 정의합니다. 이 메소드는 observer의 'receive' 메소드를 호출하며, "구독이 완료되었습니다."라는 메시지를 전달합니다.

  3. Person1 클래스와 Person2 클래스: 두 클래스는 Observer 인터페이스를 구현(implement)하므로 'receive' 메소드를 오버라이드합니다. 이 메소드는 받은 메시지를 출력합니다. 또한 'subscribe'라는 메소드를 정의하는데, 이 메소드는 새로운 Youtube 객체를 생성하고, 'notifys' 메소드를 호출하여 Youtube가 메시지를 보내도록 합니다.

  4. 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);
    }
}

3. reference

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

profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글