관리 메뉴

개발자의 스터디 노트

자바 디자인패턴 - 옵저버 패턴(Observer Pattern) 본문

자바/인스턴트코드

자바 디자인패턴 - 옵저버 패턴(Observer Pattern)

박개발씨 2022. 4. 13. 00:30

이번 포스팅은

https://coding-factory.tistory.com/710

 

[Design Pattern] 옵저버 패턴(Observer Pattern)에 대하여

옵저버 패턴(Observer Pattern)이란? 옵저버패턴이란 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의

coding-factory.tistory.com

위의 포스팅을 보고 작성하였습니다.

 

 

 

 

옵저버 패턴이란

 - 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴입니다. 어떤 객체에 변경사항이 발생하였을 때 이와 연관된 객체들에게 알려주는 디자인 패턴이라고 생각하면 됩니다.

옵저버 패턴에는 주체 객체와 상태의 변경을 알아야 하는 관찰 객체(Observer Object)가 존재하며 이들의 관계는 1:1이 될 수도 있고, 1:N이 될 수도 있습니다.

 

옵저버 패턴의 장점

1. 실시간으로 한 객체의 변경사항을 다른 객체에 전파할 수 있습니다.

2. 느슨한 결합으로 시스템이 유연하고 객체 간의 의존성을 제거할 수 있습니다.

 

옵저버 패턴의 단점

1. 너무 많이 사용하게 되면, 상태 관리가 힘들 수 있습니다.

2. 데이터 배분에 문제가 생기면 자칫 큰 문제로 이어질 수 있습니다.

 

옵저버 패턴 사용 예제

Observer.class

public class Observer {
    public String msg;

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

옵저버 클래스를 정의하여 공지사항을 받았을 경우 알림을 출력하는  receive함수를 만듭니다.

 

User1.class

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

Observer를 상속받는 user1을 만듭니다.

 

 

User2.class

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

Observer를 상속받는 user2를 만듭니다.

 

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

옵저버에 공지사항을 받을 유저를 추가하고 삭제하며 공지사항을 전파하는 기능을 가진 Notice클래스를 만듭니다.

 

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