Observer Pattern

2019-06-26
Design Pattern

안녕하세요. 도미닉입니다.

오늘은 옵저버 패턴에 대해서 알아보겠습니다.

옵저버 패턴이란?

위에 이미지를 보시면 주제(Subject) 객체와 옵저버(Observer) 객체가 있습니다.

주제의 데이터가 달라지면 옵저버한테 그 소식이 전해집니다.

옵저버 패턴을 사용하기 전의 상황은..

보통 다른 객체에 필요한 데이터가 있다면 그 데이터를 가지고 있는 객체에 직접 접근해서 가져와서 사용합니다.

해당 객체는 다른 객체에서 가져갈 프로퍼티의 이름을 공개해야하고 private 으로 선언할 수 없습니다.

point 의 x 좌표와 y 좌표가 drawPoint 함수를 실행하는데 필요하기 때문에 값을 가져오기 위해 private(set) 으로 선언됬습니다.

또한 x, y 라는 프로퍼티 이름을 알고 있어야 직접 접근해서 가져갈 수 있습니다.

만약 점의 위치가 바뀌어서 x, y 프로퍼티가 달라진다면 어떻게 해야할까요?

점을 그리는 drawPoint 함수가 다시 실행되서 점의 위치를 바꿔줘야 할 것입니다.

수시로 점의 위치가 바뀔 수 있다면 어떻게 해야할까요?

drawPoint 함수를 1초마다 호출해야 할까요?

이런 상황에서 필요한게 옵저버 패턴입니다.

옵저버 패턴을 사용하면..

위에 보여드렸던 이미지를 다시 보여드리겠습니다.

조금 더 이해가 가시나요?

subject 객체에 프로퍼티가 변경되면 옵저버 객체들에게 알려줍니다.

그렇게 되면 어떤 장점이 있을까요?

  • subject 객체에 들어와서 상태를 가져가게 드러내 보일 필요가 없다.
  • observer 객체가 언제 값이 바뀌는지 대기하거나 수시로 조회할 필요가 없다.

스위프트에서 옵저버 패턴의 예제

옵저버 패턴의 예제입니다.

graph 객체와 dominic 객체는 옵저버 객체이고 MyPoint 를 구독합니다.

MyPoint 는 좌표가 바뀔 때마다 옵저버들에게 알려줍니다.

정리

이상 옵저버 패턴에 대해서 알아봤습니다.

항상 값을 바뀌는지 기다리고 체크해야되는 상황이나 내가 어떤 데이터를 가지고 있는지 공개하지 않으면서 다른 객체에게 정보를 알려줄 때는 옵저버 패턴을 사용할 수 있습니다.

글 읽어주셔서 감사합니다.

참고

https://linsaeng.tistory.com/6
https://kimsunzun.tistory.com/entry/Observer감시자패턴