본문 바로가기

디자인 패턴

디자인패턴 : Observer


감시자 디자인패턴

- 옵저버 패턴은 오브젝트 사이의 일 대 다 대응 관계를 정의한다. 즉 하나의 Observable 클래스에 여러개의 observer 클래스가 등록되어 관리되는 관계를 의미한다. 옵저버패턴은 OOP를 구현하기위한 핵심 디자인패던 이다.

클래스구성 

데이터와 로직을 구현하고, 옵저버리스트를 관리하는 역할을 하는 Observable 클래스. MVC 디자인패턴에서
Model 클래스의 부모클래스 이기도 하다. 자주 사용되는 패턴이기 때문에 보통 util 폴더에 관리한다.

package util
{
     import util.Observer; //클래스타입을 맞춰주기 위한 용도 

     public class Observable
     {
          private var observers: Array; 

          public function Observable()
          { 
               observers = [];
          }

          //핵심메서드
          /*
          * observers 배열에 옵저버를 등록한다. 만약 해당 옵저버가 이미 등록되어 있다면 fasle 값을 반환한다.
          */
          public function addObserver( o: Observer ): Boolean
          {
               if(o == null) {
                    return false;
               }

               var len: Number = observers.length;
               var i: Number;

               for(i=0; i<len; ++i){
                    if(observers[i] == o){
                         return false;
                    }
               }

               observers.push(o);
               return true;
          }

          /*
          * observers 배열에 옵저버를 삭제한다. 만약 해당 옵저버가 없다면 fasle 값을 반환한다.
          */
          public function removeObserver( o: Observer ): Boolean
          {
               var len: Number = observers.length;
               var i: Number;

               for(i=len-1; i>=0; i--){
                    if(observers[i] == o){
                         observers.splice(i, 1);
                    }
               }

               return false;
          }

          /*
          * observers 배열에 등록된 모든 옵저버에게 대상객체가 변했다는것을 알려준다.
          */
          public function notifyObservers( infoObj: Object ): void
          {
              if(infoObj == undefined) {
                   infoObj = null;
              }

              //배열을 처리하는 동안 배열의 내용이 변하는것을 방지하기 위해 복사본을 만들어서 사용한다.
              var observersCopy: Array = observers.slice(0);
              var len: Number = observersCopy.length;
              var i: Number;

              for(i=0; i<len; ++i){
                   observersCopy[i].update(infoObj);
              }
          }

           //이하 메서드 옵션으로 구현해서 사용하면 되겠다.
          public function clearObservers(): void
          {

          }
          public function setChanged(): void
          {

          }
          public function clearChanged(): void
          {

          }
          public function hasChanged(): Boolean
          {

          }
          public function countObservers(): Number
          {

          }
     }
}

모든 옵저버 클래스가 상속받야아 할 클래스, 해당 클래스를 상속받으므로써 Observable 클래스의 addObsevar() 메서드 인자로 등록해서 사용할 수 있다.

package utl
{
     import util.Obsevable; 

     public interface Observer
     {
          function update( o:Observable, infoObj: Object ): void;
     }
}

'디자인 패턴' 카테고리의 다른 글

디자인패턴 : MVC  (0) 2011.08.03
디자인패턴 : Singleton  (0) 2011.08.03
디자인패턴 : Command  (0) 2011.08.03
디자인패턴 : Composite  (0) 2011.08.03
디자인패턴 : Iterator  (0) 2011.08.03