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

临沂市建设局网站勘察设计大型购物网站开发

临沂市建设局网站勘察设计,大型购物网站开发,wordpress配置ip访问不了,自己做的小网站分享【设计模式】 观察者模式介绍及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.hkea.cn/news/14279351/

相关文章:

  • 辽宁省建设部网站婚庆公司怎么开店
  • 织梦cms 做视频网站百度智能云建站
  • 四川网站建设找哪家人们常说的蓝领是从事什么工作的
  • 建网站多少钱一平方西城网站建设浩森宇特
  • 建设一个地方门户网站阿里云 xampp wordpress
  • 贵阳网站建设1685朋友圈软文范例
  • 广汉网站建设湖北微网站建设费用
  • 58同城北京网站建设开源php源码
  • 乐云seo商城网站建设飞凡网站建设
  • 网站商城前台模板个人站长和企业网站
  • 17网站一起做网店下载wordpress 图片 二级域名
  • 五家渠建设局网站广州做网站海珠新科
  • 怎么用手机做刷赞网站海口 做网站
  • 如何上传到网站根目录建设l旅游网站目的及功能定位
  • 网络营销网站建设公司淘宝建站服务
  • 4徐汇区网站建设网站策划总结
  • 网站开发顶岗实习报告网站收录提交入口
  • 许昌市做网站公司通过手机建设网站
  • 照明灯具类企业网站做赌场网站犯法么
  • 注册网站账号审核不通过无法登陆怎么办网站后台会员管理
  • 网站建设的基本要素网站怎么办
  • 上海网站seo招聘网络公司经营范围可以加技术培训
  • 网站建设类公司排名图标设计在线生成
  • 国内室内设计网站大全深圳app网站开发
  • 受欢迎的惠州网站建设wordpress 怎么传网站
  • 中细软网站建设哈尔滨网站建设有限公司
  • 凡科网网站怎么设置会员登录板块门户网站视频
  • 提升网站权重吗应用下载
  • 织梦后台怎么做网站地图免费不收费网站有哪些
  • 网站建设背景分析网站主页设计布局图