首页 > 其他分享 >C语言-观察者模式

C语言-观察者模式

时间:2023-06-13 15:36:22浏览次数:44  
标签:Observer int 观察者 value C语言 subject1 模式 subject

点击查看代码
#include <stdio.h>

#define MAX_OBSERVERS 10        

typedef struct Observer{
    int Oberver_value;
    void (*update)(struct Observer *observer, int value);
}Observer;

typedef struct Subject{
    int value;
    Observer *observes[MAX_OBSERVERS];      
    int observeCount;
}Subject;

void updateFunction(Observer *observer, int value) 
{
    observer->Oberver_value = value;
    printf("Observer have updated with value: %d\n", observer->Oberver_value);
}


void registerObserver(Subject *subject, Observer *Observer)
{
    if(subject->observeCount < MAX_OBSERVERS)
    {
        subject->observes[subject->observeCount++] = Observer;
    }
}

void notifyObservers(Subject *subject)
{
    for(int i = 0; i < subject->observeCount; i++)
    {
        subject->observes[i]->update(subject->observes[i],subject->value);
        //subject->observes[i]->Oberver_value = subject->value;
        //printf("Observer[%d] updated with value: %d\n",i+1,subject->observes[i]->Oberver_value);
    }
}

void  setValue(Subject *subject, int value)
{
    subject->value = value;
    notifyObservers(subject);
}


int main()
{
    
   Subject subject1;                          //被观察者

   subject1.value = 0;
   subject1.observeCount = 0;

   Observer observer1;                        //观察者
   observer1.update = updateFunction;
   Observer observer2;                        //观察者
   observer2.update = updateFunction;
   Observer observer3;                        //观察者
   observer3.update = updateFunction;


   registerObserver(&subject1, &observer1);  //注册观察者
   registerObserver(&subject1, &observer2);  //注册观察者
   registerObserver(&subject1, &observer3);  //注册观察者

   setValue(&subject1,100);                  //设置被观察者的值,并内存通知、更新观察者的值 

      

   return 0;
}

标签:Observer,int,观察者,value,C语言,subject1,模式,subject
From: https://www.cnblogs.com/Charles-Hui/p/17477643.html

相关文章

  • MVVM开发模式+双向数据绑定及扩展
    一、MVVM开发模式(1)前端的视图层概念=》由MVC演化(2)M:model【模型层】:渲染页面所以来的数据源(通过ajax从服务端获取的数据)  V:view【视图层】:将数据模型转换成UI展示给用户  VM:【视图模型层】:当监听到DOM变化时,会自动地更新数据源里面所依赖的数据......
  • C语言:进制转换器,实现二进制、八进制、十进制、十六进制之间的相互转化
    1#include<stdio.h>2#include<stdlib.h>3#include<string.h>4#include<ctype.h>56intdec2bin(intn){//十进制转二进制7if(n==0){8return0;9}else{10return(n%2+10*de......
  • c语言:计数器实验
    要求:P1口接2只LED灯,定时器T1采用计数模式,方式1中断,外接按钮开关作为计数输入,当按2次按钮开关,P1口第一只LED点亮,再按2次按钮开关,P1口第二只LED点亮,再按2次按钮,所有LED灯熄灭。 1#include<reg52.h>23//定义LED灯的控制端口和对应的控制位4sbitLED1=P1^0;5......
  • 聊聊如何利用服务定位器模式按需返回我们需要的服务实例
    前言什么是服务定位器模式服务定位器是一个了解如何提供各种应用所需的服务(或组件)的对象。在服务定位器中,每个服务(或组件)都只有一个单独的实例,并通过ID唯一地标识。用这个ID就能从服务定位器中得到这个服务(或组件)。何时可以考虑使用服务定位器模式服务定位器模式的目......
  • Go学设计模式--原型模式的考查点和使用推荐
    这篇原创本周发布过一次,名字和内容有些问题,不利于长期留存,重新整理发布一次。如果一个类的有非常多的属性,层级还很深。每次构造起来,不管是直接构造还是用建造者模式,都要对太多属性进行复制,那么有没有一种好的方式让我们创建太的时候使用体验更好一点呢?今天的文章里就给大家介......
  • C语言-策略模式
    1.假设我们需要实现一个排序程序,可以对一个整型数组进行排序。我们需要使用策略模式来封装不同的排序算法,例如冒泡排序、插入排序和快速排序。2.Code点击查看代码#include<stdio.h>#include<stdlib.h>#include<string.h>//策略接口typedefvoid(*Strategy)(int*,in......
  • 【技术积累】软件设计模式中的工厂模式【一】
    什么是工厂模式?工厂模式是一种设计模式,它利用工厂类来创建对象,而不是在程序中直接实例化对象。工厂模式可以隐藏创建对象的具体细节,提高代码可维护性和可扩展性。其核心思想是将对象的创建与具体实现分离开来,通过工厂类统一管理对象的创建,使得客户端无需了解创......
  • C语言,函数包含失败问题
    1.头文件包含顺序出错导致头文件中的函数无法使用eg:在主函数中调用support.h中的strcat()函数失败,但是明明已经包含了strcat()函数的头文件进来;编译器还是提示“Undefinedsysbolsupport(refreedfromxxx.o)”.以下函数只是简单举例,请不要直接拿来编译main中,先调用了includ......
  • MVC 模式和三层架构
    1.MVC模式‍MVC模式和三层架构是一些理论的知识,将来我们使用了它们进行代码开发会让我们代码维护性和扩展性更好。‍MVC是一种分层开发的模式,其中:M:Model,业务模型,处理业务V:View,视图,界面展示C:Controller,控制器,处理请求,调用模型和视图​​‍控制器(serlvlet)用来接收浏......
  • 备忘录模式:保存对象状态
    备忘录模式是一种行为型设计模式,用于保存对象的状态,以便在需要时恢复该状态。它通常用于撤销操作或回滚事务。示例代码//被保存状态的对象classOriginator{privateStringstate;publicvoidsetState(Stringstate){this.state=state;}......