Observer 정리

LeeJ·2023년 2월 13일
0

CS

목록 보기
3/11

옵저버 패턴

옵저버 패턴이란?

옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 발행/구독 모델로 알려져 있기도 하다.
_출처 : 위키피디아_


예시

Observer.class

public class Observer {
    public String msg;

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

User1.class

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

User2.class

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

Notice.class

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

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

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); // user1 공지사항 받는 대상에서 제거
        msg = "안녕하세요~";
        notice.notifyObservers(msg);
    }
}

왜 옵저버 패턴인가

장점

  • 실시간으로 한 객체의 변경사항을 다른 객체에 전파할 수 있다.
  • 느슨한 결합으로 시스템이 유연하고 객체간의 의존성을 줄일 수 있다.

단점

  • 너무 많이 사용하게 되면, 상태 관리가 힘들 수 있다.
  • 데이터 배분에 문제가 생기면 큰일이 날 수도 있다.

느슨한 결합? (Loose Coupling)

두 객체가 느슨하게 결합되어 있다는 것은, 그 둘이 상호작용을 하긴 하지만 서로에 대해 잘 모르는 것을 의미한다. 옵저버 패턴에서는 주제와 옵저버가 느슨하게 결합되어 있는 객체 디자인을 제공한다

옵저버를 언제든 새로 추가, 제거할 수 있다.
새로운 형식의 옵저버라 할 지라도 주제를 전혀 변경할 필요가 없다.
주제와 옵저버는 서로 독립적으로 재사용 할 수 있다.
주제나 옵저버가 바뀌더라도 서로에게 영향을 미치지 않는다.

Loose Coupling 디자인을 활용하면 변경사항이 생겨도 무난히 처리할 수 있는 유연한 객체지향 시스템을 구축할 수 있다. 객체 사이의 상호의존성을 최소화가 가능하기 때문.

profile
헤응

0개의 댓글