• 옵저버 패턴(observer pattern) 개요

    2017. 9. 12. 02:20

    by. 위지원

    디자인 패턴이란?


    우선 옵저버라는 패턴을 알아보기전에 패턴이란게 무엇인지부터 알아보자

    디자인 패턴이란 건축학,컴퓨터 과학에서 사용되는 요어로써 설계 문제에 대한 해답을 '문서화'하기 위해 고안된 '형식 방법'이다

    각 영역에서 관련된 패턴들을 구조적으로 정리한 것을 '패턴 언어'라고 한다.


    소프트웨어 개발 방법에서 사용되는 디자인 패턴은 프로그램 개발과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여 후에 재사용하기 좋게 특정 규약을 묶어서 정리한것으로 특정한 상황에서 구조적인 문제를 해결하는 방식을 '설명'해준다.



    옵저버 (observer) 패턴이란?


    -옵저버 패턴이란 옵저버의 목록을 객체에 등록하여 상태변화가 있을때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴

    -발행/구독 모델로도 알려져 있다.  

    -예를 들어서 뉴스를 발행하는 것을 객체라하고 이 뉴스를 구독하는 사람을 옵저버라고 하자.이럴때 뉴스가 바뀌면 이를 중간매개를 통해 옵저버들에게 

    뉴스내용을 알리는것이다.


    인터페이스를 이용하여 객체간의 느슨한 결합을 한다.

    -느슨한결합? : 상속으로 구현하는게아니라 A에 B가 있다라는것을 의미하는 구성을 이용하는것

    : 객체에 객체를 포함시키는게 아니라 인터페이스를 포함하는 방식


    -옵저버(퍼블리셔) 인터페이스를 정의 한 후에 이를 implement한 클래스를 이용하는것임!


    -위에서 정의 된 옵저버 인터페이스는 자기를 implement한 옵저버들을 관리하는 메서드를 가지고 있음

    -구독을 원하는 옵저버들을 제외,등록시키고,등록된 옵저버들에게 정보를 알려주는 3가지의 메서드를 가지고있다.


    주제(interface)<---------------------[구현]Concrete 주제(class)<----------------[의존]Concrete옵저버(class)[구현]----------------------->옵저버(interface)  


    **의존 : (주제객체에 의존 함)  // 1:1, 1:N의 관계가 될 수 있다 (옵저버가 N)


    위에서


    -주제 : register,remove,notify 로 옵저버를 등록,제거 할 수 있고 노티파이로 변경된 상태를 알려줄 수 있다.


    -옵저버 :notify를 가지고 있다.


    구현


    -옵저버(리스너)를 관찰 대상이 되는 객체에 등록시킨다. 는것이 핵심


    -이벤트가 발생하면 각 옵저버는 콜백을 받음


    -옵저버의 notify함수는 관찰대상이 발행한 메세지를 받거나 옵저버가 생성한 인자값을 전달 함


    -객체는 register,unregister 함수를 이용해서 옵저버를 등록,제거할 수 있음

    -임시로 작동을 멈추거나 재개해서 이벤트가 홍수같이 발생하는것을 막을 수도 있음


    -** 옵저버 패턴이 사용되는 시스템에는 순환실행을 막아야 한다!

    -예를 들어서 이벤트E가 발생하면 A옵저버가 B옵저버를 갱신한다고 할때 만약 B옵저버는 이를 위해 A옵저버를 갱신해야한다면  또다시 A로 하여금 이벤트E가 발생한다.그래서 이벤트E가 한번 처리된 후에 A가 이벤트E를 다시 발생시키지 않는 방법이 필요하다.



    이용예


    -외부 발생 이벤트에 대한 응답

    -객체 속성 값 변화에 따른 응답 ( 가끔은 이런 변화에 대한 처리가 아니라 그냥 속성 값 자체를 바꾸기도 한다)

    -java swaing 라이브러리 이벤트관리를 위해 옵저버 페턴을 사용




    대화의 장 💬