[해결] 옵저버 패턴(Observer Pattern)을 공부하다가 궁금한 점이 생겼습니다.

litmus80의 이미지

안녕하세요. 옵저버 패턴을 공부하다가 궁금한 점이 생겨서 글을 올립니다.

책에서 보면 옵저버 패턴이란 "한 객체의 상태에 변화가 일어나면, 해당 객체의 상태에 관심 있는 모든 다른 객체들에게 자동으로 변화가 발생한 사실을 알려주는 방식"라고 하는데요. 바로 이 부분이 조금 혼동스럽습니다.

첫번째로는 오직 일방적으로 주제 객체에서 옵저버 객체쪽으로 메시지가 전달된다는 건지 아니면 옵저버 객체끼리도 주제 객체를 통해 메시지 전달이 가능하다는 의미인지 말입니다.

두 번째로는 주제 객체를 거점으로 각각의 옵저버들이 다양한 상태값을 공유하고 있다면, 원칙으로는 그것을 변화시키기 위한 주체는 주제객체이거나 주제객체를 참조하는 클라이언트 객체인지, 아니면, 옵저버가 주제객체에 접근하여 상태값을 변경시켜도 괜찮다는 건지 잘 모르겠습니다.

선배님들께 부디 답변을 부탁드립니다 ^^;

vacancy의 이미지


옵저버는 그저 지켜볼 뿐이니,
보통 주체 객체에 side effect를 주거나 하지는 않습니다.

옵저버 패턴을 사용하는 이유는
보통 주체 객체에 어떤 변경이 일어난 시점을
외부에서 바로 눈치채기는 어렵기 때문입니다.
그래서 주체 객체가 능동적인 일을 하는 것이죠.

그 외의 기능은 이 패턴의 설명과는 상관없다고 해야겠죠.

prio의 이미지

observer 패턴은 subject와, subject의 상태 변화를 read-only로 읽어가려는 여러 객체 간의 단순한 일대다 종속 관계를 위한 것이라고 이해하시는 것이 좋겠습니다.

궁금해 하신 것과 같이 특정 객체를 매개로 상태값을 공유하여 그를 이용해 메시지 전달을 하거나 여러 객체의 동작을 컨트롤하기 위한 패턴으로는 mediator 가 있습니다. observer와 유사해서 혼동하기 쉽고, 상황에 따라 경계가 불분명할 수도 있습니다만 보통 observer 패턴은 read-only 또는 그에 준하는 경우에 한정합니다. (라고 저는 생각합니다. ㅎㅎ)

litmus80의 이미지


vacancy님 prio 님

친절하고 세세한 답변 주셔서 정말 감사합니다.

역시 명쾌한 해답을 얻기에는 KLDP 만큼 좋은 곳이 없군요 ㅠㅜ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.