23 가지 디자인 모드 의 Observer 모드 (게시 - 구독 모드) [C 언어]
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
전송 요청 시 jackson 대소 문자 추출 값 이상 과 직렬 화 된 속성 문제 학습 기록그리고 get, set, @ JSONAny Setter 주 해 를 읽 는 방법 ---addMethods(props); 그래서 get, set, @ JsonAny Setter 가 주석 을 달 수 있 는 방법 에서 얻 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.