Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

JAVA Developer Training

옵저버 패턴 (Observer Pattern ) 본문

디자인패턴

옵저버 패턴 (Observer Pattern )

Romenest 2021. 9. 6. 09:01

옵저버패턴은 객체의 상태 변화를 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 

옵저버패턴의 장점으로는

  • 실시간으로 한 객체의 변경사항을 연관된 객체에게 전달해 줄 수 있다.
  • *느슨한 결합 으로 유연한 시스템과 객체간의 의존성을 제거할 수 있다.

* 느슨한 결합은 옵저버를 시간에 구애받지않고 언제든 새로 추가, 제거 할 수 있다.

  새로운 형식의 옵저버를 추가하더라도 기존 주제를 변경할 필요가없다.

  주제와 옵저버는 독립적으로 이용할 수 있다

  주제나 옵저버가 바뀌더라도 서로 영향을 미치지않는다

 

단점으로는

  • 너무 많이 사용하게된다면 상태관리가 힘들 수 있다.
  • 데이터 배분에 문제가 생긴다면 큰 문제로 이어질 수 있다.

 

옵저버패턴의 기능을 간단히 말한다면 어떠한 하나의 객체 (A) 와 연관된 다른 객체 (B,C,D ... ) 들에게 A의 변화가 일어났을 경우 각각 알림을 보내주거나 지정된 기능을 수행하는 것이다.

 

예시로 유튜브의 영상을 올리는 객체 유튜버 ( A ) 가 구독자 ( B, C , D .. ) 들에게 오늘 저녁 10시에 새로운 영상이 올라갈 것이다 라고 공지사항을 썼을때 각각의 구독자들에게 알림이 가는 경우라고 볼 수 있겠다.

 

그럼 이 예시로 간단한 코드를 작성하여 이해 해보도록 하자

 

옵저버 패턴은 보통 주제 ( Subject ) 인터페이스와

옵저버 ( Observer ) 인터페이스가 들어있는 클래스 디자인으로 구현한다

 

우선 변경사항을 받아 메세지를 보내는 옵저버 클래스를 정의한다

public class Observer {
    public String msg;

    public void receive(String msg){
        System.out.println(this.msg + "에서 메시지를 받음 : " + msg);
    }
}

 

Observer를 상속받는 구독자 1을 만든다

public class Subscriber1 extends Observer{
	
    public Subscriber1(String msg){
        this.msg = msg;
    }
}

 

Observer를 상속받는 구독자 2를 만든다

public class Subscriber2 extends Observer{
	
    public Subscriber2(String msg){
        this.msg = msg;
    }
}

 

이후 변경사항, 공지사항을 받아 전파하는 기능을 가진 Notify클래스를 만든다

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

public class Notify {
    private List<Observer> observers = new ArrayList<Observer>();

    // 옵저버에 추가
    public void add(Observer observer){
        observers.add(observer);
    }

    // 옵저버에서 제거
    public void delete(Observer observer){
        observers.remove(observer);
    }

    // 옵저버들에게 알림
    public void notifyObservers(String msg){
        for (Observer o:observers) {
            o.receive(msg);
        }
    }
}

 

이후 메인 클래스에서 이러한 방식으로 사용하면된다.

public class Main {
    public static void main(String[] args) {
        Notify notify = new Notify();
        Subscriber1 subscriber1 = new Subscriber1("구독자1");
        Subscriber2 subscriber2 = new Subscriber2("구독자2");
        
        notify.add(subscriber1);
        notify.add(subscriber2);
       
        String msg = "오늘 오후 8시 영상이 올라갈 예정입니다.";
        notify.notifyObservers(msg);

        notice.delete(subscriber2); // subscriber2 공지사항 받는 대상에서 제거
        msg = "구독자2 는 볼 수 없는 알림입니다";
        notify.notifyObservers(msg);
    }
}

 

--내용 수정,추가 할것 --