Observerの概要
Observerとはオブジェクトの状態が変わったら、依存関係にあるオブジェクトへ通知されるという仕組みをもつデザインパターン
詳細は下記参考. yusuke-ujitoko.hatenablog.com
Cでの実装
Cには継承の概念がないので, コールバック関数を関数ポインタを用いて実装する.
#include <stdio.h> #define MAX 5 typedef void (* Update) (void); typedef void (* Notify) (void); typedef void (* Attach) (Update); typedef void (* SetData) (char *); struct Subject { Update obs[MAX]; char *data; int size; Attach attach; Notify notify; SetData setData; }; struct Subject subject; void viewUpdate(void){ printf("I am an observer\n%s", subject.data); } int i; void subjectNotify(void){ for(i=0; i<subject.size i++) subject.obs[i](); } void subjectAttach(Update upd){ subject.obs[subject.size++] = upd; } void subjectSetData(char *str){ subject.data = str; subject.notify(); } int main() { subject.data = "This is a subject data ver.1\n"; subject.attach = subjectAttach; subject.notify = subjectNotify; subject.setData = subjectSetData; subject.size = 0; subject.attach(viewUpdate); subject.setData("This is a subject data ver.2\n"); return 0; }