設計模式初探 行爲模式 觀察者模式 c語言 版本實現

上午簡單的學習了觀察者模式,首先想到的是羣郵件和微博加粉絲。於是寫了個鳳姐與粉絲的小程序。

我對設計模式是初次學習,理解可能並不準確,只能按照自己的理解去用程序模擬設計模式,希望理解的與其真正含義不要相差太遠爲好。


/**設計模式 行爲模式 觀察者模式 鳳姐與粉絲
  *2013年7月28
  *
 */
#include <stdio.h>
#include <stdlib.h>
struct Fans {
    struct Fengjie* fengjie;
    void ( *update) ();                             //粉絲獲得鳳姐的新狀態,被動獲得
    void ( *joinfans)(struct Fans fans);            //粉絲有權選擇成爲鳳姐粉絲
    void ( *quitfans)();                            //粉絲有權選擇退出鳳姐粉絲圈
};
struct Fengjie {
    int fansnum;
    struct Fans fanslist[100];                     //負責通知的粉絲的數量,最多100個粉絲
    void ( *notify) (struct Fengjie* fengjie);     //由鳳姐發出更新通知
    void ( *addfans)(struct Fengjie* fengjie, struct Fans fans);    //鳳姐這邊也可以增加刪除粉絲
 //   void ( *)delfans)();                            //to be done
};
void fan1update(){                                  //不同粉絲收到新信息後有不同行爲
    printf ("fan1 got new news! Unbelievable,Fengjie weight %d now!\n",rand()%10 +50);
}
void fan2update(){                                  //不同粉絲收到新信息後有不同行爲
    printf ("fan2 got new news! Fengjie's new weight is %d , oh my god.\n",rand()%10 +50);
}
void joinfans(struct Fans fans) {
    fans.fengjie->addfans(fans.fengjie, fans);      //粉絲這邊直接調用鳳姐的函數來把該粉絲加入粉絲圈
}

void notify (struct Fengjie* fengjie){
    int i;
    for (i = 0; i < fengjie->fansnum; i++)
        fengjie->fanslist[i].update();
}
void addfans (struct Fengjie* fengjie, struct Fans fans) {
    fengjie->fanslist[fengjie->fansnum] = fans;
    fengjie->fansnum++;
}
int main (void) {
    srand((unsigned) time(0));
    struct Fengjie fengjie;
    fengjie.notify = notify, fengjie.addfans = addfans, fengjie.fansnum = 0;

    struct Fans fan1, fan2;
    fan1.fengjie = &fengjie, fan1.joinfans = joinfans, fan1.update = fan1update;
    fan2.fengjie = &fengjie, fan2.joinfans = joinfans, fan2.update = fan2update;
    fan1.joinfans (fan1);
    fan2.joinfans (fan2);

    fengjie.notify (&fengjie);




}

另外可以根據不同的粉絲寫相應的update響應,這又讓我想到了網上說的控件菜單等對明令的響應。
觀察者只要發現目標有什麼風吹草動就會採取行動,這時該稱爲監視者。

發佈了40 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章