您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
php设计模式-观察者模式
发布时间:2021-09-22 21:03:21编辑:雪饮阅读()
之前有了解过java的设计模式中的观察者模式很典型,php中也有,不晓得之前我有没有发过关于php中观察者的设计模式。
那么不管有没有发过,这次都再来了解下。
观察者模式很好理解。
就假比你下单后一般要写订单日志和给用户发通知或者短信之类的。
那么这样就出现了下订单这个事件本身是一个被关注的事情,一旦关注到下订单了,则就要对应去发短信和写订单日志。
那么在这里被观察者就是订单了,而观察者就是写日志和给用户发送通知了。
那么:
ISubject.php:
<?php
//被观察者抽象类
abstract class ISubject
{
private $observers = [];//观察者集合
//添加观察者
public function attach(IObserver $observer){
array_push($this->observers, $observer);
}
//移除观察者
public function detach(IObserver $observer){
return false;
}
//通知所有观察者
public function nodifyObservers($data){
if(count($this->observers) == 0) return false;
foreach ($this->observers as $observer){
$observer->update($data);
}
}
//被观察者发生改变
public abstract function change($data);
}
//观察者接口(这里感觉是抽象类也可以)
interface IObserver
{
public function update($data);
}
//被观察者实例-订单
class OrderSubject extends ISubject
{
//订单观察者实现被观察者改变事件
public function change($data)
{
$this->nodifyObservers($data);
}
}
//日志观察者
class LogObserver implements IObserver
{
//日志观察者观察到订单变化,触发自己的写日志功能
public function update($data)
{
print_r( 'write log to file.');
}
}
//短信观察者
class SmsObserver implements IObserver
{
//短信观察者观察到订单变化,触发自己的发短信功能
public function update($data)
{
print_r( 'send sms');
}
}
//创建一个订单
$order_subject = new OrderSubject();
//添加订单的观察者-写日志
$order_subject->attach(new LogObserver());
//添加订单的观察者-发短信
$order_subject->attach(new SmsObserver());
//订单状态变化,触发日志和短信的观察者
$order_subject->change(['oid' => '1', 'flag' => 3]);
//被观察者抽象类
abstract class ISubject
{
private $observers = [];//观察者集合
//添加观察者
public function attach(IObserver $observer){
array_push($this->observers, $observer);
}
//移除观察者
public function detach(IObserver $observer){
return false;
}
//通知所有观察者
public function nodifyObservers($data){
if(count($this->observers) == 0) return false;
foreach ($this->observers as $observer){
$observer->update($data);
}
}
//被观察者发生改变
public abstract function change($data);
}
//观察者接口(这里感觉是抽象类也可以)
interface IObserver
{
public function update($data);
}
//被观察者实例-订单
class OrderSubject extends ISubject
{
//订单观察者实现被观察者改变事件
public function change($data)
{
$this->nodifyObservers($data);
}
}
//日志观察者
class LogObserver implements IObserver
{
//日志观察者观察到订单变化,触发自己的写日志功能
public function update($data)
{
print_r( 'write log to file.');
}
}
//短信观察者
class SmsObserver implements IObserver
{
//短信观察者观察到订单变化,触发自己的发短信功能
public function update($data)
{
print_r( 'send sms');
}
}
//创建一个订单
$order_subject = new OrderSubject();
//添加订单的观察者-写日志
$order_subject->attach(new LogObserver());
//添加订单的观察者-发短信
$order_subject->attach(new SmsObserver());
//订单状态变化,触发日志和短信的观察者
$order_subject->change(['oid' => '1', 'flag' => 3]);
运行效果:
C:\Users\Administrator\PhpstormProjects\untitled\organizing>D:\phpstudy_pro\Extensions\php\php7.3.4nts\php.exe C:\Users\Administrator\PhpstormProjects\untitled\organizing\src\ISubject.php
write log to file.send sms
关键字词:php,设计模式,观察者模式