【资料图】
观察者模式是一种行为设计模式,它定义了对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖它的对象都将得到通知并自动更新。这种模式也叫做发布-订阅模式,它能够解决对象之间的耦合关系。
观察者模式有三个角色:Subject(主题)、Observer(观察者)和ConcreteObserver(具体观察者)。Subject是被观察的对象,当它的状态发生改变时,会通知所有观察它的对象。Observer是观察者,它定义了接收通知的接口,所有观察者都实现这个接口。ConcreteObserver是具体的观察者,它实现了Observer接口,当Subject的状态发生改变时,它会接收到通知并作出相应的处理。
观察者模式的优点是可以实现松耦合,即Subject和Observer之间的耦合度很低,它们可以独立地改变而不会影响到对方。此外,观察者模式还支持广播通信,即Subject可以同时通知多个Observer。
下面是一个使用观察者模式的示例。假设有一个天气主题,它会随着天气的变化通知所有的观察者。观察者可以是显示天气的页面或者是发送短信的手机应用程序。
首先,我们需要定义Subject接口,它定义了注册、移除和通知观察者的方法:
interface Subject{ public function registerObserver(Observer $observer); public function removeObserver(Observer $observer); public function notifyObservers();}
接下来,我们定义Observer接口,它定义了接收通知的方法:
interface Observer{ public function update($temperature, $humidity, $pressure);}
然后,我们实现具体的Subject类,它维护了一个观察者列表,当它的状态发生改变时,会通知所有观察者::
class WeatherData implements Subject{ private $observers; private $temperature; private $humidity; private $pressure; public function __construct() { $this->observers = array(); } public function registerObserver(Observer $observer) { $this->observers[] = $observer; } public function removeObserver(Observer $observer) { $key = array_search($observer, $this->observers, true); if ($key !== false) { unset($this->observers[$key]); } } public function notifyObservers() { foreach ($this->observers as $observer) { $observer->update($this->temperature, $this->humidity, $this->pressure); } } public function measurementsChanged() { $this->notifyObservers(); } public function setMeasurements($temperature, $humidity, $pressure) { $this->temperature = $temperature; $this->humidity = $humidity; $this->pressure = $pressure; $this->measurementsChanged(); }}
最后,我们实现具体的Observer类,它实现了Observer接口的update方法,当它接收到通知时,会更新自己的状态:
class CurrentConditionsDisplay implements Observer{ private $temperature; private $humidity; private $pressure; private $weatherData; public function __construct(Subject $weatherData) { $this->weatherData = $weatherData; $this->weatherData->registerObserver($this); } public function update($temperature, $humidity, $pressure) { $this->temperature = $temperature; $this->humidity = $humidity; $this->pressure = $pressure; $this->display(); } public function display() { echo "Current conditions: " . $this->temperature . "F degrees and " . $this->humidity . "% humidity\n"; }}
在这个示例中,WeatherData类是Subject,它维护了一个观察者列表,并实现了注册、移除和通知观察者的方法。CurrentConditionsDisplay类是具体的观察者,它实现了Observer接口的update方法,当它接收到通知时,会更新自己的状态并调用display方法显示当前的天气信息。
使用观察者模式的主要步骤如下:
定义Subject接口,其中包含注册、移除和通知观察者的方法。定义Observer接口,其中包含接收通知的方法。实现具体的Subject类,维护观察者列表,并实现注册、移除和通知观察者的方法。实现具体的Observer类,实现接收通知的方法并更新自己的状态。在主程序中,创建具体的Subject和Observer对象,将Observer对象注册到Subject对象中,当Subject的状态发生改变时,通知所有注册的Observer对象。关键词:
PHP面向对象的设计模式-观察者模式_动态焦点
5G应用及6G愿景分论坛丨IMT-2030(6G)推进组需求工作组组长王庆扬:依托分布式AI服务实现6G普慧智能 全球新资讯
世界观察:速看!23年5月cfa一级考试内容
当日快讯:索尼预计2023财年销售2500台PS5游戏机,较两年前翻番 每日焦点
动态焦点:做完胃镜要注意什么 做完胃镜后吃什么食物最好
花“Young”宝山 四川彭州第九届宝山蔷薇花节正式开幕
天天视讯!基于北斗定位等,高德地图正式上线手机端弯道会车预警功能
2023年3月工业企业利润数据点评:工业品价格对企业盈利的拖累加大_当前热议
探馆数字中国建设成果展:AI让数字生活更精彩-天天视讯
全球热讯:调整种植结构 助力乡村振兴
世界快讯:员工述职报告怎么写个人_员工述职报告怎么写
古人如何吃烧烤?博物馆里的文物告诉你
兰花的画法与雕刻_兰花的画法
世界热推荐:盘点市场上几只值得关注的新能源主题基金
美媒:微软游戏业务CEO称收购动视暴雪旨在加快游戏战略,无法完成交易“也会继续前进” 世界快资讯
上街区“红色文艺轻骑兵”走基层文艺演出火热进行中
2023贵州黔南州人民检察院招聘派遣制检察辅助人员拟聘用人员公示
世界百事通!“十二背后”溶洞音乐周 华少探秘“溶洞KTV”
王嘉尔:希望到世界各地分享中国的元素|每日观察
三钢闽光:一季度净亏损0.66亿元,今年计划产钢1113万吨
环球观焦点:2024保时捷Panamera在最新的照片中展示卡宴改款内饰设计
每日速讯:医生提醒:嘴唇干也别用舌头舔 小心诱发唇炎
namaste发音 namaste
新消费测评丨小龙虾新奇口味频出 是噱头还是真好吃?丨封面天天见_每日时讯
当前滚动:晨鸿信息招聘潍坊版找工作_晨鸿信息招聘潍坊版
严守安全底线 提升安全水平_世界热点评
【全球热闻】经济大省再挑大梁 地方拼经济各显其能
冷门好听的词组id(2019年12月14日星期三)-环球热讯
大冶法院连夜突击扣车,被执行人这下慌了神
天天快讯:吃鲜枣有什么好处坏处_吃鲜枣有什么好处
四川黄金4月11日快速上涨
莱荣高铁南海段开始铺轨|微动态
微资讯!吉利熊猫mini性价比高,但这两个缺点不能忽略
生态环境部:新发现黄河干流入河排污口5200余个
世界报道:深圳地铁一男子狂踹车厢门,目击者:门都被踢坏了,他到站后就跑了,客服:暂未收到反馈
世界热文:数对讲解_数对
相关新闻