科普文章中,介绍了观察者模式的使用及其优缺点。模式动机+观察者模式是较常用的设计模式之一,尤其是当系统中包含多个复杂子系统时,通常会使用它。这就像为系统中的某个子模块运行任务。子模块更改后,它将通知该子模块其他子模块。一个经典的例子是我们的操作系统使用的GUI界面。当我们在GUI系统中使用各种应用程序时,我们只需要用鼠标轻轻单击软件右上方的全屏/非全屏,软件中的所有组件都将进行相应的缩放,并且在这里使用观察者模式。观察者模式定义:定义对象之间的多对一依赖关系,以确保当依赖对象发生更改时,所有依赖关系都将自动更新。当一个对象需要通知其他对象,并且您无法预测将通知哪些对象时,观察者模式用于限制和减少对象的耦合关系。方案案例+在MCU开发中,串行通讯是非常重要的通讯方式。在业务代码中,有许多子模块专注于串行通信数据。假设当串行端口数据到来时,我们需要通知每个子模块。伪代码实现://串行端口中断urat_isr(){... //通过设置全局变量来通知子模块,notify_module1 = 1; //通过设置全局变量notify_module2 = 1来通知子模块; //通过设置全局变量来通知子模块三个notify_module3 = 1; ...)... // Main函数,创建多个线程来处理不同的任务int main()(... // Thread 1(子模块一个)create_thread1 (); //线程2(子模块2)create_thread2(); //线程3(子模块3)create_thread3(); ...}在上述代码实现中,当更新串行端口数据时,通过设置1来设置全局变量,以通知每个子模块,每个子模块有机会运行后,判断和更新串行通讯数据,在该实现方案中,通过以下方式通知子模块串口数据全局变量非常严格,一旦需要通知的子模块发生更改,则必须更改代码的串行端口中断部分改进计划+当多个子系统同时监视某个子系统时,观察者模块应添加以解开由通信引起的子系统耦合。伪代码实现: //定义观察对象的数量#define num 3 //定义观察对象的typedef struct object {//定义观察对象的通知接口void(* update)();)Object; //定义观察者模块typedef structobserver {Object * objectList [num];} Observer; //定义一个观察者模块Observer aobserver; // Main函数,创建多个线程来处理不同的任务int main(){///初始化每个观察对象aobserver.objectList [0 ]-> update = Update_module1; aobserver.objectList [1]-& gt; update = Update_module2; aobserver.objectList [2]-& gt; update = UpdateUpdate_module3; ... //线程1(子模块1 )create_thread1(); //线程2(子模块2)create_thread2(); //线程3(子模块3)create_thread3(); ...)//串行端口中断urat_isr(){... for(i = 0 ;我& lt; num; i ++)aobserver.objectList [i]-& gt; update(); ...}每个子模块的通知接口可以这样实现:// module1通知接口void Update_module1(){//传递全局设置通知子模块一个的变量notify_module1 = 1;} // module2通知接口void Update_module2(){//通过设置全局变量notify_module2 = 1来通知子模块;} // module3通知接口void Update_module3(){/ / notify子模块,方法是设置全局变量a notify_module3 = 1;}摘要+这是C语言中的观察者模式,它可以动态地增加或减少观察对象,释放子模块之间的直接耦合,并可以防止程序需求变化不大。但是,在实际使用过程中,您需要考虑开发效率和操作效率的问题:一个观察者,多个观察对象,开发和调试过程会稍微复杂一些。通知功能应尽可能避免过多的操作开销。确实有必要执行一些耗时的操作。您可以考虑引入一种类似于“中断上下文”的机制。 Linux系统。本文已授权从公共帐户转载“嵌入式linux共享”,作者Yasuo兄弟-END-建议阅读[01] C语言十种经典排序算法(动态演示+代码,值得收集)[02] C语言,嵌入了一些