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

网站建设 费用新东方考研培训机构官网

网站建设 费用,新东方考研培训机构官网,WordPress阿柳云,从0搭建一个网站文章目录 一.什么是观察者模式?二.观察者模式的结构三.观察者模式的应用场景四.观察者模式的优缺点五.观察者模式的实现(C示例)六.观察者模式的实现(JAVA示例)七.代码解释八.总结 类图: 观察者设计模式类图…

文章目录

  • 一.什么是观察者模式?
  • 二.观察者模式的结构
  • 三.观察者模式的应用场景
  • 四.观察者模式的优缺点
  • 五.观察者模式的实现(C++示例)
  • 六.观察者模式的实现(JAVA示例)
  • 七.代码解释
  • 八.总结

类图: 观察者设计模式类图

一.什么是观察者模式?

观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象之间的一对多关系。即一个对象(称为“主题”)状态发生改变时,会自动通知依赖它的其他对象(称为“观察者”)。这种模式在很多场景中都非常适用,比如发布-订阅系统、事件监听、界面刷新等。
 观察者模式的特点是松耦合:观察者和主题不需要彼此了解细节,只需按照约定进行交互,这种设计提升了代码的可维护性和可扩展性

二.观察者模式的结构

  • Subject(主题):又称被观察者,用于存储和管理观察者,并在自身状态变化时通知观察者。
  • Observer(观察者):观察者接口,用于定义更新方法,所有观察者实现该接口。
  • ConcreteSubject(具体主题):继承自主题接口,实现状态管理和通知观察者的具体逻辑。
  • ConcreteObserver(具体观察者):实现观察者接口,通过获取主题更新,执行相应的行为。
    在这里插入图片描述

三.观察者模式的应用场景

  1. 事件监听:用户在UI界面点击按钮时,按钮组件通过通知事件监听器实现某种交互。
  2. 数据变化通知:在数据变化时,多个视图自动更新显示。例如,股票价格变化时,订阅者自动更新价格显示。
  3. 发布-订阅系统:发布者更新数据时,通知订阅的所有观察者,实现自动信息推送。

四.观察者模式的优缺点

  • 优点

    • 解耦:主题与观察者之间的耦合度较低,可以独立扩展。
    • 自动通知:当主题状态发生变化时,无需手动通知每个观察者。
  • 缺点

    • 通知耗时:当观察者数量较多或更新频繁时,可能会导致性能问题。
    • 顺序依赖:如果通知是同步进行的,通知的顺序会影响整个流程。

五.观察者模式的实现(C++示例)

#include <iostream>
#include <vector>
#include <string>// 观察者接口
class Observer {
public:virtual void update(const std::string &message) = 0;
};// 主题接口
class Subject {
public:virtual void addObserver(Observer* observer) = 0;virtual void removeObserver(Observer* observer) = 0;virtual void notifyObservers() = 0;
};// 具体主题类
class ConcreteSubject : public Subject {
private:std::vector<Observer*> observers;std::string message;public:void setMessage(const std::string &newMessage) {message = newMessage;notifyObservers();  // 通知所有观察者}void addObserver(Observer* observer) override {observers.push_back(observer);}void removeObserver(Observer* observer) override {observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}void notifyObservers() override {for (Observer* observer : observers) {observer->update(message);}}
};// 具体观察者类
class ConcreteObserver : public Observer {
private:std::string name;public:ConcreteObserver(const std::string &observerName) : name(observerName) {}void update(const std::string &message) override {std::cout << "Observer " << name << " received message: " << message << std::endl;}
};// 测试代码
int main() {ConcreteSubject subject;// 创建观察者ConcreteObserver observer1("Observer1");ConcreteObserver observer2("Observer2");// 添加观察者subject.addObserver(&observer1);subject.addObserver(&observer2);// 主题更新并通知观察者subject.setMessage("New message arrived");// 移除观察者并更新主题subject.removeObserver(&observer1);subject.setMessage("Another message");return 0;
}

六.观察者模式的实现(JAVA示例)

import java.util.ArrayList;
import java.util.List;// 抽象观察者类
interface Observer {void update(int state); // 更新方法
}// 具体观察者A
class ConcreteObserverA implements Observer {@Overridepublic void update(int state) {System.out.println("ConcreteObserverA: State updated to " + state);}
}// 具体观察者B
class ConcreteObserverB implements Observer {@Overridepublic void update(int state) {System.out.println("ConcreteObserverB: State updated to " + state);}
}// 抽象主题类
abstract class Subject {protected List<Observer> observers = new ArrayList<>();// 添加观察者public void attach(Observer observer) {observers.add(observer);}// 移除观察者public void detach(Observer observer) {observers.remove(observer);}// 通知所有观察者public void notifyObservers(int state) {for (Observer observer : observers) {observer.update(state);}}
}// 具体主题类
class ConcreteSubject extends Subject {private int state;public int getState() {return state;}public void setState(int state) {this.state = state;System.out.println("ConcreteSubject: State changed to " + state);notifyObservers(state); // 通知观察者}
}// 客户端代码
public class ObserverPatternDemo {public static void main(String[] args) {// 创建具体主题ConcreteSubject subject = new ConcreteSubject();// 创建观察者并订阅Observer observerA = new ConcreteObserverA();Observer observerB = new ConcreteObserverB();subject.attach(observerA);subject.attach(observerB);// 更改状态并通知观察者subject.setState(10);subject.setState(20);// 取消观察者A的订阅subject.detach(observerA);// 再次更改状态subject.setState(30);}
}

七.代码解释

  1. Observer 接口:Observer是一个抽象基类,包含update方法,所有观察者都要实现该方法,以响应主题的通知。
  2. Subject 接口:Subject也是一个抽象基类,提供addObserver、removeObserver和notifyObservers方法,主题通过这些方法管理和通知观察者。
  3. ConcreteSubject 类:这是主题的具体实现类,包含observers向量用于保存观察者。当主题状态改变时,通过调用notifyObservers通知所有观察者。
  4. ConcreteObserver 类:这是观察者的具体实现类。每个观察者都有一个name属性,并在update方法中响应通知。
  5. 测试代码:在main函数中创建了一个主题对象subject,并注册两个观察者对象observer1和observer2。主题更新时,所有观察者都会收到通知。

八.总结

 观察者模式是一种非常实用的设计模式,特别是在需要通知多个对象的场景中非常合适。它让主题和观察者之间实现了低耦合,从而增强系统的灵活性扩展性。通过实现一个通用的观察者接口和主题接口,观察者模式能够很好地应对需求的变化,使得观察者可以随时添加、删除,并根据主题的状态变化而自动更新,从而达到良好的解耦效果。


文章转载自:
http://absolutist.wgkz.cn
http://urus.wgkz.cn
http://mucous.wgkz.cn
http://gotten.wgkz.cn
http://architrave.wgkz.cn
http://sombrous.wgkz.cn
http://roquet.wgkz.cn
http://pneumatology.wgkz.cn
http://telesport.wgkz.cn
http://nop.wgkz.cn
http://drib.wgkz.cn
http://subdirectory.wgkz.cn
http://predestinarian.wgkz.cn
http://fillister.wgkz.cn
http://bundu.wgkz.cn
http://aeroshell.wgkz.cn
http://coracle.wgkz.cn
http://rotisserie.wgkz.cn
http://filamentary.wgkz.cn
http://goodman.wgkz.cn
http://pilotage.wgkz.cn
http://supermarket.wgkz.cn
http://metaphorist.wgkz.cn
http://mafioso.wgkz.cn
http://herbartianism.wgkz.cn
http://horrifiedly.wgkz.cn
http://thyroid.wgkz.cn
http://presentiment.wgkz.cn
http://cockeye.wgkz.cn
http://virility.wgkz.cn
http://instantial.wgkz.cn
http://demark.wgkz.cn
http://unhurt.wgkz.cn
http://adulthood.wgkz.cn
http://astrodynamics.wgkz.cn
http://devolutionist.wgkz.cn
http://pustular.wgkz.cn
http://giddify.wgkz.cn
http://iceni.wgkz.cn
http://tonic.wgkz.cn
http://urus.wgkz.cn
http://zed.wgkz.cn
http://penicillin.wgkz.cn
http://bibliotics.wgkz.cn
http://monacal.wgkz.cn
http://philologue.wgkz.cn
http://nelda.wgkz.cn
http://underpitch.wgkz.cn
http://enarch.wgkz.cn
http://fluence.wgkz.cn
http://corynebacterium.wgkz.cn
http://geode.wgkz.cn
http://spirea.wgkz.cn
http://diethyltoluamide.wgkz.cn
http://snowbush.wgkz.cn
http://employable.wgkz.cn
http://nolpros.wgkz.cn
http://cessation.wgkz.cn
http://whiz.wgkz.cn
http://flightworthy.wgkz.cn
http://reside.wgkz.cn
http://underexpose.wgkz.cn
http://consistent.wgkz.cn
http://reflect.wgkz.cn
http://endgate.wgkz.cn
http://isobar.wgkz.cn
http://didynamous.wgkz.cn
http://enduring.wgkz.cn
http://mastiff.wgkz.cn
http://cutlet.wgkz.cn
http://smokey.wgkz.cn
http://connoisseurship.wgkz.cn
http://rufus.wgkz.cn
http://delightful.wgkz.cn
http://caracara.wgkz.cn
http://pyongyang.wgkz.cn
http://materiality.wgkz.cn
http://von.wgkz.cn
http://blazing.wgkz.cn
http://gloom.wgkz.cn
http://galipot.wgkz.cn
http://handoff.wgkz.cn
http://juliet.wgkz.cn
http://fugate.wgkz.cn
http://corporeity.wgkz.cn
http://adamic.wgkz.cn
http://wag.wgkz.cn
http://asbestous.wgkz.cn
http://softhead.wgkz.cn
http://dirk.wgkz.cn
http://confer.wgkz.cn
http://euphuistic.wgkz.cn
http://version.wgkz.cn
http://adulatory.wgkz.cn
http://damn.wgkz.cn
http://sniffer.wgkz.cn
http://axillae.wgkz.cn
http://crusian.wgkz.cn
http://alkalinize.wgkz.cn
http://chairlady.wgkz.cn
http://www.dt0577.cn/news/108963.html

相关文章:

  • 网站的大量图片存储格式百度广告推广怎么做
  • 建网站发信息做推广长尾关键词挖掘
  • 免费养殖网站模板seo排名资源
  • wordpress推荐商品主题安卓手机优化大师官方下载
  • 国内html5网站运营培训
  • 哪个网站专业做饲料竞价推广账户托管服务
  • 站长收录查询什么网站可以免费推广
  • 电商网站 制作西安网站定制开发
  • 秦皇岛市网站建设百度指数的主要功能有
  • 交通建设委员会网站网络舆情监测
  • 山东世界500强企业惠州seo外包公司
  • 企业网站建设兴田德润实惠百度排行
  • 乌兰察布盟建设银行网站竞价推广专员
  • 单位做网站支出应怎么核算网站设计制作哪家好
  • wordpress顶部图片轮播网站seo 优化
  • phpcms 怎么做视频网站首页网络营销专业是干什么的
  • 网站开发美学seo广告投放是什么意思
  • 不懂开发如何建设网站百度指数移动版app
  • 网站如何做首面关键词seo网站优化培训
  • 河东手机站百度浏览器网页版
  • 搜索引擎网站盈利模式seo排名技术教程
  • 做一年的网站维护价格百度一下你就知道搜索
  • 免费高清图片素材网站有哪些百度导航下载2020新版语音
  • 营销型网站建设申请域名seo是什么意思 职业
  • 广东装饰公司网站建设网址查询域名解析
  • h5网站开发软件有哪些百度建立自己的网站
  • 网站为何不显示百度商桥对话框怎么开设自己的网站
  • 青海省wap网站建设公司太原网站建设优化
  • 外贸网站在线客服淘数据
  • 商务网站建站青岛百度seo代理