当前位置: 首页 > news >正文

临沂市建设局网站勘察设计1000个免费邮箱账号

临沂市建设局网站勘察设计,1000个免费邮箱账号,分销商城极差系统,北京市建设工程交易服务中心网站【设计模式】 观察者模式介绍及C代码实现 背景 在软件构建过程中#xff0c;我们需要为某些对象建立一种“通知依赖关系”#xff0c;即一个对象#xff08;目标对象#xff09;的状态发生改变#xff0c;所有的依赖对象#xff08;观察者对象#xff09;都将得到通知。…【设计模式】 观察者模式介绍及C代码实现 背景 在软件构建过程中我们需要为某些对象建立一种“通知依赖关系”即一个对象目标对象的状态发生改变所有的依赖对象观察者对象都将得到通知。如果这样的依赖关系过于紧密将使软件不能很好地抵御变化。 假设有一个简单的应用场景一个气象站记录当地天气的温度、湿度和气压并将这些数据展示在一个显示屏上。现在需要实现一个气象站的应用支持多个显示屏同时显示气象数据这时候就可以使用观察者模式来实现。 定义 观察者模式Observer Pattern是一种常用的设计模式它定义了一种一对多的依赖关系让多个观察者对象同时监听某一个主题对象当主题对象发生变化时它的所有观察者都会收到通知并更新自己的状态。观察者模式又称为发布-订阅模式。 观察者模式的主要角色包括以下几个部分 Subject主题被观察的对象它将所有观察者对象的引用保存在一个集合中并提供了添加和删除观察者对象的方法。 Observer观察者观察者接口定义了更新自己的状态的方法以便主题在状态发生变化时通知观察者。 ConcreteSubject具体主题具体的主题实现类维护一个状态并在状态发生变化时通知所有观察者。 ConcreteObserver具体观察者具体的观察者实现类实现观察者接口中定义的方法以便在接收到主题的通知时更新自己的状态。 应用场景 观察者模式常常被用于以下场景 一对多的依赖关系当一个对象的状态发生变化时需要通知多个对象并且这些对象需要根据主题对象的状态进行相应的处理这时可以使用观察者模式。 发布-订阅模型观察者模式也被称为发布-订阅模型。在这个模型中主题对象充当发布者的角色而观察者充当订阅者的角色。主题对象不需要知道具体的观察者只需要通知所有的观察者即可。 GUI 事件处理在 GUI 编程中经常使用观察者模式来处理用户界面事件。例如当用户点击按钮时程序会通知所有的事件监听器来处理该事件。 网络编程在网络编程中经常使用观察者模式来实现异步通信。例如当客户端连接服务器时服务器会通知所有的客户端连接已建立。 总之当一个对象的状态发生变化时需要通知多个对象并且这些对象需要根据主题对象的状态进行相应的处理时可以使用观察者模式。观察者模式可以帮助我们降低系统的耦合度增强系统的灵活性和可维护性。 模式结构 实现步骤 观察者模式的实现步骤如下 定义 Subject 接口该接口定义了注册观察者、删除观察者和通知观察者的方法。 定义 Observer 接口该接口定义了观察者需要实现的方法。 定义具体主题类 ConcreteSubject实现 Subject 接口并包含观察者列表。具体主题类负责管理观察者列表并在状态发生改变时通知观察者。 定义具体观察者类 ConcreteObserver实现 Observer 接口并在 update 方法中更新自己的状态。 在具体主题类中实现注册观察者、删除观察者和通知观察者的方法。 在具体观察者类中实现 update 方法当主题对象的状态发生改变时观察者会接收到通知并更新自己的状态。 在客户端代码中创建具体主题对象和具体观察者对象并将观察者注册到主题对象中。 当主题对象的状态发生改变时观察者会接收到通知并更新自己的状态从而实现观察者模式的功能。 观察者模式的核心思想是将主题和观察者解耦使得它们可以独立地变化。主题对象负责管理状态和通知观察者而观察者对象负责更新自己的状态。观察者模式可以帮助我们降低系统的耦合度增强系统的灵活性和可维护性。 C语言代码示例 #include stdio.h #include stdlib.h #include string.h// 定义观察者接口 typedef struct _Observer {void (*update)(struct _Observer* self); } Observer;// 定义主题接口 typedef struct _Subject {void (*registerObserver)(struct _Subject* self, Observer* observer);void (*removeObserver)(struct _Subject* self, Observer* observer);void (*notifyObservers)(struct _Subject* self); } Subject;// 定义具体观察者类 typedef struct _ConcreteObserver {Observer base;char name[20]; } ConcreteObserver;// 定义具体主题类 typedef struct _ConcreteSubject {Subject base;Observer* observers[10];int count;int state; } ConcreteSubject;// 实现具体观察者类的更新方法 void ConcreteObserver_update(Observer* self) {ConcreteObserver* observer (ConcreteObserver*)self;printf(%s: state changed\n, observer-name); }// 实现具体主题类的注册观察者方法 void ConcreteSubject_registerObserver(Subject* self, Observer* observer) {ConcreteSubject* subject (ConcreteSubject*)self;if (subject-count 10) {subject-observers[subject-count] observer;} }// 实现具体主题类的删除观察者方法 void ConcreteSubject_removeObserver(Subject* self, Observer* observer) {ConcreteSubject* subject (ConcreteSubject*)self;for (int i 0; i subject-count; i) {if (subject-observers[i] observer) {for (int j i; j subject-count - 1; j) {subject-observers[j] subject-observers[j 1];}subject-count--;break;}} }// 实现具体主题类的通知观察者方法 void ConcreteSubject_notifyObservers(Subject* self) {ConcreteSubject* subject (ConcreteSubject*)self;for (int i 0; i subject-count; i) {subject-observers[i]-update(subject-observers[i]);} }int main() {// 创建具体主题对象ConcreteSubject subject;memset(subject, 0, sizeof(ConcreteSubject));subject.base.registerObserver ConcreteSubject_registerObserver;subject.base.removeObserver ConcreteSubject_removeObserver;subject.base.notifyObservers ConcreteSubject_notifyObservers;// 创建具体观察者对象ConcreteObserver observer1, observer2;memset(observer1, 0, sizeof(ConcreteObserver));memset(observer2, 0, sizeof(ConcreteObserver));observer1.base.update ConcreteObserver_update;observer2.base.update ConcreteObserver_update;strcpy(observer1.name, Observer 1);strcpy(observer2.name, Observer 2);// 注册观察者subject.base.registerObserver(subject.base, (Observer*)observer1);subject.base.registerObserver(subject.base, (Observer*)observer2);// 改变主题对象的状态subject.state 1;// 通知观察者subject.base.notifyObservers(subject.base);// 删除观察者 总结 使用面向对象的抽象 Observer模式使得我们可以独立地改变目标与观察者从而使二者之间的依赖关系达致松耦合。 目标发送通知时无需指定观察者通知可以携带通知信息作为参数会自动传播。 观察者自己决定是否需要订阅通知目标对象对此一无所知。 观察者模式是基于事件的UI框架中非常常用的设计模式也是MVC模式的一个重要组成部分。
http://www.dnsts.com.cn/news/187397.html

相关文章:

  • 如何批量建站mvc做的网站如何发布访问
  • 网站建设合同 简单基于html5的电商网站开发
  • 重庆中小企业网站建设公司建设银行怎么在网站设置限额
  • 做金融量化的网站百度云网站开发怎样开网站
  • 辽宁城建设计院有限公司网站wordpress图片粘贴插件
  • 模特公司网站模板产品推广方案策划书
  • 网站推广排名宣传页制作
  • 服装网站的建设方案网站建设钟振森
  • 中国站长之家域名查询成都的做网站公司
  • 织梦网站修改教程视频网站如何做的有气质
  • 网站 定制东莞网站建设公司 网络服务
  • 如何设置网站名字吗广州公司注册代理机构
  • 珠海市城乡住房建设局网站快速搭建网站demo
  • 衡水建站公司品牌营销公司
  • 常州网站开发培训广州有哪些建筑公司
  • 创新的福州网站建设网站app建设需要资源
  • 注册大创网网站建设seo策略
  • 做淘宝头像的网站有哪些网络设计方案ppt
  • 网站宽度建公司网站流程
  • 微信公众号登录wordpress网站网吧网络组建方案
  • 早教网站源码猎头公司联系方式
  • 西凤九网站建设的目标网络工程属于计算机类吗
  • 网站的市场营销方案网站的构造
  • 网站备案网站要有内容吗网站建设财务计划与预测
  • 客户网站回访以公开的文化
  • 网站怎样做wap端微网站制作提供商推荐
  • 网站空间的分类搭建自己的个人网站
  • 昆明哪有做网站的网站运营公司
  • 安徽省建设厅网站官网c#做的网站怎么上传
  • 家政公司网站建设方案视频网站 费用