设计模式十:观察者模式

观察者模式:

  对个对象依赖于一个对象。当一个对象改变时,所有依赖它的对象都会获得通知和改变。发布订阅。

<?php

/**
 * 小说更新接口
 */
interface StoryUpdateInterface{
    public function update($name);
}

class StoryUpdate implements StoryUpdateInterface{
    public function update($name)
    {
        echo "{$name}小说更新之后".PHP_EOL;
    }
}


 /**
  * 消息发送接口
  */
interface SendMsgInterface{
    public function send($name,$storyName);
}

class SendMsg implements SendMsgInterface{
    public function send($name,$storyName)
    {
        echo "短信:{$name}你好,{$storyName}小说更新了".PHP_EOL;
    }
}

class SendEmail implements SendMsgInterface{
    public function send($name,$storyName)
    {
        echo "邮件:{$name}你好,{$storyName}小说更新了".PHP_EOL;
    }
}

/**
 * 观察者模式-》
 */
abstract class StoryUpdateAbstract{
    private $Observer;

    //注册观察者
    public function register(SendMsgInterface $obj){
        $this->Observer[] = $obj;
    }

    //消息发送
    public function notify($name,$storyName){
        foreach($this->Observer as $obj){
            $obj->send($name,$storyName);
        }
    }
}

/**
 * 客户端
 */
class Story extends StoryUpdateAbstract{

    private $story;
    private $notify_arr=[];
    
    public function __construct(StoryUpdateInterface $story,array $notify_arr)
    {
        $this->story = $story;    
        $this->notify_arr = $notify_arr;
    }

    public function StoryUpdate($storyName){
        $this->story->update($storyName);
        foreach($this->notify_arr as $name){
            $this->notify($name,$storyName);
        }
        
    }
}

$storyUpdate = new StoryUpdate();
$list = ['小张','小王','莉拉','doris'];
$story = new Story($storyUpdate,$list);
$story->register(new SendMsg());//添加观察者
$story->register(new SendEmail());//添加观察者
$story->StoryUpdate('霸道总裁');

设计模式十:观察者模式

 

上一篇:day16 二叉搜索树中的搜索(leetcode)


下一篇:day16-斗地主作业