Skip to content

Dev

옵저버 패턴

DesignPattern1 min read

1. Observer 패턴이란 ?

Observer 패턴은 객체의 상태변화를 관찰하는 관찰자들(Observers)이 어떤 객체의 상태가 변화될 때마다 메서드를 통해 등록된 관찰자들(Observers)에게 통지하는 디자인 패턴이다. 발행-구독 Model로도 알려져 있다.

객체들 사이에 1:N의 의존관계를 정의해 두어, 어떤 객체가 상태가 변할 때 그 객체에 의존성을 가진 다른 객체들이 그 변화를 통지 받고 자동으로 갱신될 수 있게 만드는 패턴
-GOF의 디자인패턴

Obserser패턴 다이어그램

관찰자(Observer)와 관찰자에게 어떤 객체의 상태변화에 대해 통보하는 역할을 하는 주체(Subject)가 있다.

관찰자주체의 상태 변화가 있을 때마다 통보를 받는다.

예제로 생각해보면, 우리가 흔히 사용하고 있는 카카오톡 단톡방에서 누군가 Message를 전송하면 Push 데이터로 나의 핸드폰에 발송된다. 여기서 이 Message 전송을 단톡방에 참여한 모든 사람이 가능한 것이 아니라 방장만 가능하다고 가정해보자. (쉬운예제를 위해)
그럼 단톡방에서 발생된 Message를 항상 감시하고 관찰하는 대상인 객체는 단톡방에 참여한 사람들이 관찰자(Observer)에 해당되며, 방장이 Message를 발송함으로써 단톡방의 상태가 새로운 Message가 쌓여 변경되어 모든 관찰자에게 알리는 역할을 함으로써 단톡방이 주체(Subject)가 된다고 할 수 있다.

1public interface Observer {
2 void update();
3}
4
5public class Mina implements Observer {
6
7 private MessageSubject messageSubject;
8
9 public Mina(MessageSubject messageSubject) {
10 this.messageSubject = messageSubject;
11 }
12
13 @Override
14 public void update() {
15 List<String> messages = messageSubject.getMessageList();
16 messages.stream().forEach(o->System.out.println(o));
17 }
18
19}
20
21public class ChulSoo implements Observer {
22
23 private MessageSubject subject;
24
25 public ChulSoo(MessageSubject subject){
26 this.subject = subject;
27 }
28
29 @Override
30 public void update() {
31 List<String> messages = subject.getMessageList();
32 messages.stream().forEach(o->System.out.println(o));
33 }
34}

철수와 미나라는 관찰자(Observer) 객체가 있으며, 이 각 관찰자 객체메세지라는 상태 자료구조를 필드값으로 가지고 있다.

1public abstract class RoomSubject {
2
3 private List<Observer> observerList = new ArrayList<>();
4
5 //관찰자(Observer)를 추가
6 public void enter(Observer observer) {
7 observerList.add(observer);
8 }
9
10 //관찰자(Observer)를 제거
11 public void exit(Observer observer) {
12 observerList.remove(observer);
13 }
14
15 //방에 입장한 모든 유저(관찰자)에게 상태변경을 통지
16 public void announce() {
17 observerList.forEach(Observer::update);
18 }
19}
20
21public class MessageSubject extends Subject {
22
23 private List<String> messageList = new ArrayList<>();
24
25 //새로운 메세지가 등록이 되면, 모든 감시자들에게 상태변화를 알린다.
26 public void addMessage(String message){
27 messageList.add(message);
28 announce();
29 }
30
31 public List<String> getMessageList(){
32 return messageList;
33 }
34}

RoomSubject관찰자인 단톡방 참여자들를 관리하는 클래스이다. RoomSubject를 상속받은 MessageSubject는 Room(단톡방) 내에 Message의 상태 자료구조를 담당하는 클래스이다. MessageSubject의 자료구조가 변경될 때마다 부모클래스인 RoomSubject에게 전달하고 RoomSubject는 자신이 관리하고 있는 관찰자들에게 데이터값이 변경되었다는 것을 통지하게 된다.

Subject(주체)클래스에 대한 구체적인 상태값에 대한 클래스는 자식 클래스로 구현함으로써 Message뿐만아니라 기타 다양한 상태값을 Observer(관찰자)에게 전달할 수 있다.

옵저버예제UML

1public class Client {
2 public static void main(String[] args) {
3 MessageSubject messageSubject = new MessageSubject();
4
5 ChulSoo chulSoo = new ChulSoo(messageSubject);
6 Mina mina = new Mina(messageSubject);
7
8 messageSubject.enter(chulSoo);
9 messageSubject.enter(mina);
10
11 messageSubject.addMessage("메세지 신규 등록");
12 }
13}

예제출력물

실습예제링크

[Refference]