🐷

C 言語 で Observer パターン

2021/01/28に公開
/*
  Observer パターン的な
*/

#include <stdio.h>
#include <stdarg.h>

#define OBSERVER_MAX 4
typedef void (*observer)(int argc, ...);
observer observers[OBSERVER_MAX];

int end_index;

void register_observer(observer o)
{
  if(end_index >= OBSERVER_MAX)
  {
    printf("queue is full\n");
    return;
  }
  observers[end_index] = o;
  end_index++;
}

void notify_observer(void)
{
  int i;

  for(i = 0; i < end_index; i++)
  {
    observer o = observers[i];
    if(o != NULL)
    {
      o(1, i);
    }
  }
}

void initialize(void)
{
  int i;
  for(i = 0; i < OBSERVER_MAX; i++)
  {
    observers[i] = NULL;
  }
  end_index = 0;
}

void update1(int argc, ...)
{
  int i;
  va_list args;
  va_start(args, argc);

  printf("update1\n");

  for(i = 0; i < argc; i++)
  {
    int n;
    n = va_arg(args, int);
    printf("%d\n", n);
  }
  va_end(args);
}


void update2(int argc, ...)
{
  int i;
  va_list args;
  va_start(args, argc);

  printf("update2\n");

  for(i = 0; i < argc; i++)
  {
    int n;
    n = va_arg(args, int);
    printf("%d\n", n);
  }
  va_end(args);
}

void test_observer(void)
{
  printf("test_observer start\n");
  initialize();
  register_observer(update1);
  register_observer(update2);
  notify_observer();
  printf("test_observer end\n");
}


int main(int ac, char** av)
{
  test_observer();
  return 0;
}
test_observer start
update1
0
update2
1
test_observer end

Discussion