一、观察者模式:示例1
1.观察者(订阅者)
1.1 函数接口实现
void action1(char *str)
{
printf("观察者1接收到消息:%s\n",str);
}
void action2(char *str)
{
printf("观察者2接收到消息:%s\n",str);
}
void action3(char *str)
{
printf("观察者3接收到消息:%s\n",str);
}
1.2 观察者接口
typedef struct _Observer
{
void (*action)(char *str);
}Observer;
1.3 实例化具体观察者
Observer ObserverEXP1 =
{
.action = action1,
};
Observer ObserverEXP2 =
{
.action = action2,
};
Observer ObserverEXP3 =
{
.action = action3,
};
1.4 采用链表的方式存储 观察者们
typedef struct _ObserverNode
{
Observer *ob;
struct _ObserverNode *next;
}ObserverNode;
ObserverNode *obHead = NULL;
void observerInit()
{
obHead = (ObserverNode *)malloc(sizeof(ObserverNode));
obHead->ob = NULL;
obHead->next = NULL;
}
2.被观察者(发布者)
2.1 函数接口实现
void AddObserver(Observer *pObserver)
{
ObserverNode * node = (ObserverNode *)malloc(sizeof(ObserverNode));
node->ob = pObserver;
node->next = NULL;
ObserverNode * current = obHead;
while (current->next != NULL)
{
current = current->next;
}
current->next = node;
}
void DelObserver(Observer *pObserver)
{
ObserverNode * current = obHead;
ObserverNode * lastNod = obHead;
while (current != NULL)
{
if(current->ob == pObserver)
{
if(current->next == NULL)
{
free(lastNod->next);
lastNod->next = NULL;
current = NULL;
}
else
{
free(lastNod->next);
lastNod->next = lastNod->next->next;
current = lastNod->next;
}
}
else
{
lastNod = current;
current = current->next;
}
}
}
void NotifyObserver(char *str)
{
ObserverNode * current = obHead;
while (current != NULL )
{
if(current->ob != NULL)
{
current->ob->action(str);
}
current = current->next;
}
}
2.2 被观察者接口
typedef struct _Subject
{
void (*addObserver)(Observer *pObserver);
void (*delObserver)(Observer *pObserver);
void (*notifyObserver)(char *str);
}Subject;
2.3 实例化具体被观察者
Subject SubjectEXP =
{
.addObserver = AddObserver,
.delObserver = DelObserver,
.notifyObserver = NotifyObserver,
};
3.应用场景
void client()
{
observerInit();
SubjectEXP.addObserver(&ObserverEXP1);
SubjectEXP.addObserver(&ObserverEXP2);
SubjectEXP.addObserver(&ObserverEXP3);
SubjectEXP.notifyObserver("干饭111");
printf("<----------------------------------> \n");
SubjectEXP.delObserver(&ObserverEXP3);
SubjectEXP.delObserver(&ObserverEXP1);
SubjectEXP.notifyObserver("干饭222");
}
4.运行效果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6343b70d9f99ee7f3829827af74aa7c3.png)
二、观察者模式:示例2
1.代码实现
void restaurant_1 (float MuttonPrice)
{
printf("%s, MuttonPrice:%f \n",__FUNCTION__,MuttonPrice);
}
void restaurant_2 (float MuttonPrice)
{
printf("%s, MuttonPrice:%f \n",__FUNCTION__,MuttonPrice);
}
typedef void(*Observer)(float);
typedef struct _ObserverNode
{
Observer ob;
struct _ObserverNode *next;
}ObserverNode;
ObserverNode *obHead = NULL;
void init()
{
obHead = (ObserverNode *)malloc(sizeof(ObserverNode));
obHead->ob = NULL;
obHead->next = NULL;
}
void addObserver( Observer restaurant)
{
ObserverNode * node = (ObserverNode *)malloc(sizeof(ObserverNode));
node->ob = restaurant;
node->next = NULL;
ObserverNode * current = obHead;
while (current->next != NULL)
{
current = current->next;
}
current->next = node;
}
void releaseObserver(Observer restaurant)
{
ObserverNode * current = obHead;
ObserverNode * lastNod = obHead;
while (current != NULL)
{
if(current->ob == restaurant)
{
if(current->next == NULL)
{
free(lastNod->next);
lastNod->next = NULL;
current = NULL;
}
else
{
free(lastNod->next);
lastNod->next = lastNod->next->next;
current = lastNod->next;
}
}
else
{
lastNod = current;
current = current->next;
}
}
}
void MuttonPriceChange (float MuttonPrice)
{
ObserverNode * current = obHead;
while (current != NULL )
{
if(current->ob != NULL)
{
current->ob(MuttonPrice);
}
current = current->next;
}
}
2.应用场景
init();
addObserver(restaurant_1);
addObserver(restaurant_2);
MuttonPriceChange(12.4);
printf("<---------------------> \n");
releaseObserver(restaurant_2);
MuttonPriceChange(9.4);
3.运行效果:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/673c3f1b972537f2a19091c4dede96ca.png)