読者です 読者をやめる 読者になる 読者になる

【C言語によるデザインパターン】Observer

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;
}

yusuke-ujitoko.hatenablog.com