PHP面向对象的设计模式-观察者模式
(资料图片)
一、概述
观察者模式是一种行为设计模式,它定义了对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖它的对象都将得到通知并自动更新。这种模式也叫做发布-订阅模式,它能够解决对象之间的耦合关系。
观察者模式有三个角色:Subject(主题)、Observer(观察者)和ConcreteObserver(具体观察者)。Subject是被观察的对象,当它的状态发生改变时,会通知所有观察它的对象。Observer是观察者,它定义了接收通知的接口,所有观察者都实现这个接口。ConcreteObserver是具体的观察者,它实现了Observer接口,当Subject的状态发生改变时,它会接收到通知并作出相应的处理。
观察者模式的优点是可以实现松耦合,即Subject和Observer之间的耦合度很低,它们可以独立地改变而不会影响到对方。此外,观察者模式还支持广播通信,即Subject可以同时通知多个Observer。
二、示例
下面是一个使用观察者模式的示例。假设有一个天气主题,它会随着天气的变化通知所有的观察者。观察者可以是显示天气的页面或者是发送短信的手机应用程序。
定义Subject接口
首先,我们需要定义Subject接口,它定义了注册、移除和通知观察者的方法:
interface Subject{ public function registerObserver(Observer $observer); public function removeObserver(Observer $observer); public function notifyObservers();}
定义Observer接口
接下来,我们定义Observer接口,它定义了接收通知的方法:
interface Observer{ public function update($temperature, $humidity, $pressure);}
实现具体的Subject
然后,我们实现具体的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类,它实现了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面向对象的设计模式-观察者模式
- 小规模和一般纳税人有什么区别_数一数二数三到底有什么区别 内容有什么区别 其他方面有什_世界快消息
- 人工智能又取得大胜?ChatGPT的健康问答结果碾压人类医生 世界热议
- 环球聚焦:新劳斯莱斯幽灵首次被嘲笑
- 【世界报资讯】万华化学(600309)4月28日主力资金净卖出932.43万元
- 口袋妖怪xypc版修改器 口袋妖怪xy修改器
- 大数据会说话㊻“五一”假期的四川:主打一个充实
- 丰山犬一般多少钱一只啊_丰山犬一般多少钱一只-世界今热点
- 中天金融将于5月19日召开股东大会_全球热消息
- 【全球独家】下了末班高铁也能坐上地铁 “五一”假期青岛地铁延时运营
- 煮鸡丝如何做才好吃 如何做水煮鸡肉丝|全球速递
- 环球今亮点!陵水县人民医院/青岛大学附属医院海南分院清水湾门诊部正式揭牌
- 魔方生活再度递表港交所,2022年营收同比增16.5%
- 2023年五一大连总工会开展集星卡赢景区门票活动
- 【独家焦点】陶都同城游戏大厅官方下载(陶都热线)
- 925纯银多少钱一克(2021年8月19日)-环球今日讯
- 献礼“五四”!来听四川监狱民警的别样告白
- 今日热闻!金达莱大手笔分红10派10元 上市以来积极回馈股东!大型项目市占率不断提升 在手订单充足
- 环球焦点!工信部:一季度我国规模以上互联网企业实现利润总额282.8亿元 同比增长55.2%
- “五一”假期7座及以下小型客车通行收费公路免收通行费_每日时讯
- 全球快消息!ES瑟瑟发抖?AG轻取KSG进八强!今屿大赛软脚虾,KSG教练越换越菜
- “产业+资本”运作不规范,绝味食品多项股权投资违规受罚,相关责任人被出具警示函_世界新动态
- 今年属牛的财运和运气如何(2023年运气如何属牛人)
- 生态环境部:多元化投融资机制支持生物多样性保护 实时焦点
- 每日热门:荀彧怎么死的(荀彧之死小说)
- 【全球播资讯】独家述评|春光无限好,不只“买买买”
- 天津德云社5月份节目单(持续更新)
- 4月28日瑞星化工尿素价格暂稳
- 重庆警方通报:一大巴侧翻致20伤 7人伤势较重_焦点速看
- 微资讯!陈奕迅的歌最好听_陈奕迅哪首歌好听