作者ChinaLeng 发布于 2年前

观察者模式定义

观察者模式(又被称为发布-订阅(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条评论