C语言实现设计模式—观察者模式

文章目录

  • C语言实现设计模式—观察者模式
    • 观察者模式介绍
    • UML用例说明
    • C语言实现
      • 定义触发更新函数接口
      • 采集线程等待触发标志更新
      • 波形存储标志等待更新

C语言实现设计模式—观察者模式

观察者模式介绍

它就像系统里面某个子模块的跑腿,一旦该子模块发生变化,它就要为这个子模块通知其他的子模块。

观察者模式定义:

  • 定义对象之间多对一的依赖关系,保证当被依赖的对象发生变化时,所有的依赖者会被自动更新。
  • 当一个对象需要通知另外一些对象,而你无法预知哪些对象将被通知时,通过观察者模式,克制减少对象的偶合关系。

优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。

缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化

UML用例说明

C语言实现设计模式—观察者模式_第1张图片

C语言实现

定义触发更新函数接口

typedef struct rz_sensor_172_t rz_sensor_172_t;
CLASS(rz_sensor_172_t)
{
     
	....
	void (*triger_update)(rz_sensor_172_t *t);
	....
};
/* observer mode: update trigger flag*/
void triger_update (rz_sensor_172_t *t)
{
     
    SubAssembly_Data_Type *pstatus = &t->rz_172_sample;
    

     /*  Once the data is read, trigger storage */
    t->is_triggered[pstatus->boltNo] = 1;
    
    /* Release the semaphore and notify the thread */
    rt_sem_release ( &rz_sample_get()->sample_over_sem );

}

采集线程等待触发标志更新

static void rz_sample_entry(void *parameter)
{
     
	rz_sample_t *t = (rz_sample_t *)parameter;

	while(1) {
     
		rt_sem_take(&t->sample_over_sem, RT_WAITING_FOREVER);
		wave_save(t);
	}

}

波形存储标志等待更新


	for(uint8_t addr = 0; addr < BOLT_SENSOR_NUMBER; addr ++) {
     
		if (1 == pbolt->is_triggered[addr]) {
     
			pbolt->is_triggered[addr] = 0;
			if (true != bolt_wave_save(t, addr)) {
     
				iret = false;
			}
		}
	}

你可能感兴趣的:(设计模式)