23 가지 디자인 모드 의 Observer 모드 (게시 - 구독 모드) [C 언어]

  • 저자: 추기 봉
  • 메 일 박스: Qifeng. [email protected]
  • 블 로그:http://blog.csdn.net/qifengzou
  • 날짜: 2012.11.15
  • '기 봉' 에서 온 CSDN 블 로그
  • 를 전재 하 십시오.
    1 개념 정의
      Observer 모드 는 게시 - 구독 모드 라 고도 합 니 다.
      Observer 모드: 한 쌍 의 다 중 의존 관 계 를 정의 하여 여러 관찰자 (Observer) 가 특정한 주제 대상 (Subject) 을 동시에 감청 하도록 합 니 다.이 테마 대상 (Subject) 의 상태 가 바 뀌 면 관찰자 대상 (Observer) 에 게 자동 으로 자신 을 업데이트 할 수 있 도록 알려 줍 니 다.
    2 모드 구성 도
    그림 1 Observer 모드 구성 도
    3 장면 디자인
      같은 그룹의 데 이 터 를 분석 하고 통 계 를 할 때 우 리 는 표 로 통계 하고 기둥 모양 으로 통계 하 며 백분율 로 통계 하 는 등 여러 가지 형식의 표 시 를 제공 하고 자 한다.이러한 표 시 는 모두 같은 그룹의 데이터 에 의존 하 는데 이 데이터 가 바 뀌 었 을 때 모든 통계 가 동시에 변화 해 야 한다.
    4C 언어 구현
      분석: 표 디 스 플레이, 막대 그래프 디 스 플레이, 백분율 디 스 플레이 는 관찰자 (Observer) 에 해당 하고 통계 데 이 터 는 관찰 된 테마 대상 (Subject) 에 해당 합 니 다.[주: C 언어 로 디자인 모델 을 실현 할 때 구체 적 인 장면 에 따라 유형 을 구조 체 또는 함수 (구성 요소) 등 으로 이해 할 수 있 습 니 다]
    - > 형식 정의 (Observer 와 Subject)
    1. 관찰자
    //      
    typedef struct
    {
        ...
        void (*update)(int);
        ...
    }observer_t;

    2. 피 관찰자
    //      
    typedef struct _observer_list_t
    {
        observer_t *observer;
        struct _observer_list_t *next;
    }observer_list_t;
    //     
    typedef struct _subject_t
    {
        int data;                 //      
        observer_list_t *observer; //      (  )
    }subject_t;

    - > 통계 업데이트 [관찰자 업데이트] 1. 표 통계 업데이트
    void update_form(int data){...}
    ...

    2. 막대 그래프 통계 업데이트
    void update_cylinder(int data){...}
    ...

    3. 백분율 통계 업데이트
    void update_percent(int data){...}
    ...

    4. 관찰자 초기 화
    void init_observer(observer_t *observer, void (*update)(int))
    {
        ...
        observer.update = update;
        ...
    }
    ...

    - > 통계 데이터 (Subject 인터페이스)
    //        
    int attach_observer(subject_t *subject, observer_t *observer)
    {
        //  observer  subject  observer  
    }
    
    //         
    int detach_observer(subject_t *subject, observer_t *observer)
    {
        //  observer  subject  observer  
    }
    //        
    int set_data(subject_t *subject, int *value)
    {
        subject->data = value;
    }
    //      
    void notify_observer(subject_t *subject)
    {
        observer_link_t *node = subject->observer;
    
        for(; NULL!=node; node=node->next)
        {
            node->observer->update(subject->data);
        }
        ...
    }
    //        
    void init_subject(subject_t *subject)
    {
        memset(subject, 0, sizeof(subject_t));
        subject->observer = NULL;
    }

    - > Observer 모드 사용
    int main(int argc, const char *agrc[])
    {
        observer_t form;       //     
        observer_t cylinder; //      
        observer_t percent; //      
        subject_t subject;    //     
    
        //       
        init_observer(&form, updateform);
        init_observer(&cylinder, updatecylinder);
        init_observer(&percent, updatepercent);
    
        //        
        init_subject(&subject);
    
        //      subject
        attach_observer(&subject, &form);
        attach_observer(&subject, &cylinder);
        attach_observer(&subject, &percent);
    
        //     ,      
        set_data(&subject, 1);
        notify_observer(&subject);
       
        set_data(&subject, 2);
        notify_observer(&subject);
     
        ...
    
        return 0;
    }
    

    좋은 웹페이지 즐겨찾기