网站域名空间一年多少钱住宅设计网站推荐
web/
2025/9/29 23:57:40/
文章来源:
网站域名空间一年多少钱,住宅设计网站推荐,重庆一般做一个网站需要多少钱,html网页框架代码你好#xff0c;这里是codetrend专栏“跟着GPT学设计模式”。
引言
观察者模式#xff08;Observer Pattern#xff09;是一种行为型设计模式#xff0c;它定义了对象之间的一对多依赖关系#xff0c;使得当一个对象的状态发生改变时#xff0c;其依赖对象都能够收到通…你好这里是codetrend专栏“跟着GPT学设计模式”。
引言
观察者模式Observer Pattern是一种行为型设计模式它定义了对象之间的一对多依赖关系使得当一个对象的状态发生改变时其依赖对象都能够收到通知并自动更新。
观察者模式Observer Design Pattern也被称为发布订阅模式Publish-Subscribe Design Pattern。一般情况下被依赖的对象叫作被观察者Observable依赖的对象叫作观察者Observer。
不过在实际的项目开发中这两种对象的称呼是比较灵活的有各种不同的叫法比如Subject-Observer、Publisher-Subscriber、Producer-Consumer、EventEmitter-EventListener、Dispatcher-Listener。
在观察者模式中有两个主要角色主题Subject和观察者Observer。主题是被观察的对象它维护了一个观察者列表并提供方法用于添加、删除和通知观察者。
观察者是监听主题的对象它定义了一个更新的方法在主题状态改变时被调用。
观察者模式的一般工作流程
主题对象维护一个观察者列表并提供方法用于注册、注销和通知观察者。观察者对象实现一个更新方法用于在主题状态改变时被调用。当主题的状态发生改变时它会遍历观察者列表调用每个观察者的更新方法。观察者根据接收到的通知进行相应的操作以使自身状态与主题保持一致。
使用 Mermaid 语法类图展示观察者模式的示意图如下 #mermaid-svg-UuaJArCu1KsrtPTv {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-UuaJArCu1KsrtPTv .error-icon{fill:#552222;}#mermaid-svg-UuaJArCu1KsrtPTv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UuaJArCu1KsrtPTv .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-UuaJArCu1KsrtPTv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UuaJArCu1KsrtPTv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UuaJArCu1KsrtPTv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UuaJArCu1KsrtPTv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UuaJArCu1KsrtPTv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UuaJArCu1KsrtPTv .marker.cross{stroke:#333333;}#mermaid-svg-UuaJArCu1KsrtPTv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UuaJArCu1KsrtPTv g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-UuaJArCu1KsrtPTv g.classGroup text .title{font-weight:bolder;}#mermaid-svg-UuaJArCu1KsrtPTv .nodeLabel,#mermaid-svg-UuaJArCu1KsrtPTv .edgeLabel{color:#131300;}#mermaid-svg-UuaJArCu1KsrtPTv .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-UuaJArCu1KsrtPTv .label text{fill:#131300;}#mermaid-svg-UuaJArCu1KsrtPTv .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-UuaJArCu1KsrtPTv .classTitle{font-weight:bolder;}#mermaid-svg-UuaJArCu1KsrtPTv .node rect,#mermaid-svg-UuaJArCu1KsrtPTv .node circle,#mermaid-svg-UuaJArCu1KsrtPTv .node ellipse,#mermaid-svg-UuaJArCu1KsrtPTv .node polygon,#mermaid-svg-UuaJArCu1KsrtPTv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UuaJArCu1KsrtPTv .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-UuaJArCu1KsrtPTv g.clickable{cursor:pointer;}#mermaid-svg-UuaJArCu1KsrtPTv g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-UuaJArCu1KsrtPTv g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-UuaJArCu1KsrtPTv .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-UuaJArCu1KsrtPTv .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-UuaJArCu1KsrtPTv .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-UuaJArCu1KsrtPTv .dashed-line{stroke-dasharray:3;}#mermaid-svg-UuaJArCu1KsrtPTv #compositionStart,#mermaid-svg-UuaJArCu1KsrtPTv .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UuaJArCu1KsrtPTv #compositionEnd,#mermaid-svg-UuaJArCu1KsrtPTv .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UuaJArCu1KsrtPTv #dependencyStart,#mermaid-svg-UuaJArCu1KsrtPTv .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UuaJArCu1KsrtPTv #dependencyStart,#mermaid-svg-UuaJArCu1KsrtPTv .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UuaJArCu1KsrtPTv #extensionStart,#mermaid-svg-UuaJArCu1KsrtPTv .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UuaJArCu1KsrtPTv #extensionEnd,#mermaid-svg-UuaJArCu1KsrtPTv .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UuaJArCu1KsrtPTv #aggregationStart,#mermaid-svg-UuaJArCu1KsrtPTv .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UuaJArCu1KsrtPTv #aggregationEnd,#mermaid-svg-UuaJArCu1KsrtPTv .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-UuaJArCu1KsrtPTv .edgeTerminals{font-size:11px;}#mermaid-svg-UuaJArCu1KsrtPTv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1 * Subject # observers: Observer[] attach(Observer observer) detach(Observer observer) notifyObservers() Observer update() ConcreteSubject - state getState() setState(state) ConcreteObserver update() Subject 是主题类包含了添加、删除和通知观察者的方法。observers 是一个观察者列表用于存储注册的观察者对象。Observer 是观察者类定义了一个 update() 方法用于在主题状态改变时被调用。ConcreteSubject 是具体主题类继承自 Subject它有一个额外的 state 属性表示当前状态并提供了获取和设置状态的方法。ConcreteObserver 是具体观察者类继承自 Observer实现了 update() 方法根据主题状态的改变来更新自身状态。
这个类图展示了观察者模式的关键组件及它们之间的关系。主题与观察者之间是一对多的关系主题可以有多个观察者。
当主题状态改变时它会通过通知方法 notifyObservers() 来遍历观察者列表并依次调用每个观察者的 update() 方法从而实现观察者的更新操作。
观察者模式的使用场景
观察者模式在实际应用中有很多场景以下是一些观察者模式的应用场景的举例
GUI 事件处理在图形用户界面GUI中观察者模式被广泛应用于事件处理机制。当用户执行某个操作时比如点击按钮或输入文本这些操作会触发相应的事件。事件作为主题被通知给注册的观察者观察者可以根据事件类型做出相应的响应例如更新界面、执行特定逻辑等。订阅/发布模式观察者模式也常被称为订阅/发布模式。在发布者-订阅者系统中发布者充当主题的角色订阅者则扮演观察者的角色。发布者负责发布消息订阅者订阅感兴趣的消息类型并在消息到达时执行相应的操作。这种模式广泛应用于消息队列系统、事件总线等。消息通知系统观察者模式也可以用于构建消息通知系统。例如一个新闻平台可以作为主题用户可以选择订阅感兴趣的新闻类别作为观察者。当新闻发布时平台会通知所有订阅了该类别的用户并将新闻推送给他们。游戏开发中的事件管理在游戏开发中观察者模式常被用于事件管理。例如游戏角色之间的互动和协作可以通过观察者模式实现。一个角色可以作为主题其他角色可以注册为观察者。当主题例如敌人角色发生改变时通知所有观察者例如友方角色并执行相应的行为。
实际上观察者模式非常灵活适用于很多具有发布-订阅关系的场景。它提供了一种松耦合的设计方式使得主题和观察者能够独立变化并保持一致性。
观察者模式使用注意事项
角色和职责观察者模式中包括主题Subject和观察者Observer两个核心角色。主题负责管理观察者的注册、注销以及通知操作而观察者则定义了接收更新通知并执行相应操作的方法。了解每个角色的职责和关系对于正确使用观察者模式非常重要。主题状态管理主题在观察者模式中起到承载和管理状态的作用。当主题状态发生变化时需要通知所有观察者。因此需要合理设计和管理主题的状态并及时触发通知操作。多线程安全性在多线程环境下使用观察者模式时需要考虑线程安全性。例如在主题状态变化时可能会遇到多个线程同时修改主题状态或触发通知的情况。需要采取相应的同步措施或使用线程安全的容器来确保并发访问的正确性。事件传递方式观察者模式中主题向观察者传递更新通知的方式可以是同步或异步的。在同步方式下主题在通知观察者后会等待观察者执行完相应操作才会继续执行而在异步方式下主题通知观察者后立即继续执行观察者的更新操作在后台进行。了解不同的事件传递方式对系统行为和性能的影响是重要的。
观察者模式编程示例
下面通过一段代码来说明观察者模式的实现。
import java.util.ArrayList;
import java.util.List;// 主题接口
interface Subject {void attach(Observer observer);void detach(Observer observer);void notifyObservers();
}// 观察者接口
interface Observer {void update();
}// 具体主题类
class ConcreteSubject implements Subject {private ListObserver observers new ArrayList();Overridepublic void attach(Observer observer) {observers.add(observer);}Overridepublic void detach(Observer observer) {observers.remove(observer);}Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update();}}// 具体主题类的其他方法// ...
}// 具体观察者类
class ConcreteObserver implements Observer {Overridepublic void update() {System.out.println(观察者收到更新通知执行相应操作。);}
}public class ObserverPatternExample {public static void main(String[] args) {// 创建具体主题对象ConcreteSubject subject new ConcreteSubject();// 创建具体观察者对象ConcreteObserver observer1 new ConcreteObserver();ConcreteObserver observer2 new ConcreteObserver();// 注册观察者subject.attach(observer1);subject.attach(observer2);// 主题发生改变时通知观察者subject.notifyObservers();}
}在上述示例中定义了一个 Subject 接口和一个 Observer 接口分别表示主题和观察者。
ConcreteSubject 是具体的主题类实现了 Subject 接口并包含了维护观察者列表、添加/删除观察者以及通知观察者的方法。
ConcreteObserver 是具体的观察者类实现了 Observer 接口并在 update() 方法中定义了观察者接收到更新通知时的操作。
在 main() 方法中创建了具体的主题对象 ConcreteSubject以及两个具体的观察者对象 observer1 和 observer2。
然后通过 attach() 方法将观察者注册到主题中然后调用 notifyObservers() 方法通知所有的观察者。当主题发生改变时所有观察者都会收到更新通知并执行相应的操作。
以上内容基于 GPT 创建和整理。
关于作者
来自一线全栈程序员nine的探索与实践持续迭代中。
欢迎关注或者点个赞~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84152.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!