观察者模式定义
观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。概念还是很清晰的,理解起来没有难度。
我们举个栗子来理解这个观察者模式。
示例
你再天猫或者京东上下单后,店家和你都是都会收到信息,商家收到下单通知,客户收到订单核对通知。
类图
Observable是被观察者的接口类,Observer是观察者的接口类。addObserver、removeObserver分别用于添加和删除观察者,notify用于内容或状态变化时通知所有的观察者。当Observable发生改变的时候的notify会调用Observer的update方法,所有观察者不需要关心被观察的对象什么时候会发生变化,只需要关注update实现就可以了。
源码
<?php
/**
* @author kuan
* Copyright (c) 2021,All Rights Reserved.
*/
interface Observable
{
//被观察者接口
//注冊观察者
public function addObserver($observer);
//移除观察者
public function removeObserver($observer);
//通知观察者
public function notify();
}
interface Observer{
//观察者的接口
public function update(Observable $observable);
}
class Business implements Observer
{
//同事商家有人下单
public function update(Observable $observable)
{
echo '用户购买了商品[' . $observable->getShopName() . '],收货地址['.$observable->getAddress().']';
}
}
class Customer implements Observer{
//通知用户确认收货地址
public function update(Observable $observable)
{
echo '您的收货地址['.$observable->getAddress().'],请确认!'.PHP_EOL;
}
}
class Order implements Observable{
//下单操作
private $observers = [];
private $shopName = "";
private $address = "";
private $mobile = "";
public function addObserver($observer)
{
$this->observers[] = $observer;
}
public function removeObserver($observer)
{
}
public function notify()
{
foreach($this->observers as $observer){
$observer->update($this);
}
}
//下单调用的方法
public function sale($shopName,$address,$mobile){
$this->shopName = $shopName;
$this->address = $address;
$this->mobile = $mobile;
$this->notify();
}
public function getShopName()
{
return $this->shopName;
}
public function setShopName($shopName)
{
$this->shopName = $shopName;
}
public function getAddress()
{
return $this->address;
}
public function setAddress($address)
{
$this->address = $address;
}
public function getMobile()
{
return $this->mobile;
}
public function setMobile($mobile)
{
$this->mobile = $mobile;
}
}
调用上面的方法
$order = new Order();
$customer= new Customer();
$business = new Business();
$order->addObserver($customer);
$order->addObserver($business);
$order->sale("Iphone 12","中国上海","12345678910");
执行的结果如下
php Index.php
您的收货地址[中国上海],请确认!
用户购买了商品[Iphone 12],收货地址[中国上海]
当调用下单方法sale时,会触发注册的观察者,去调用观察者的update方法,观察者值需要再update方法中实现自己需要做的操作。
0条评论