• 观察者模式


    观察者模式为您提供了避免组件之间紧密耦合的另一种方法
    这种模式是什么原理呢?
    咱们需要先知道什么是观察者,   大家有玩过斗地主的吧.   没玩过也见过. 就是有的人可以参与游戏.而有的人可以在边上观战. 这种观战的人,就叫观察者.
    设计模式中的观察者是什么意思呢?咱们就以实际的案例来描述这个模式 有时候,比如发广告,需要群发邮件通知一下,那怎么做呢(简单的场景,并不符合现实情况)

    这时,需要写一个类(注册器,也就是被观察者)用于注册和通知功能. 另一个类(观察者)就是用来具体通知动作的类.代码如下

    [PHP] 纯文本查看 复制代码
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    <?php
    /**
     * 注册的注册器功能
     */
    class Register
    {
        public $mObList = [];//观察者列表
        /**
         * 注册方法
         */
        public function registerObj($obj)
        {
            $this->mObList[] = $obj;
        }
        /**
         * 执行通知
         */
        public function send()
        {
            foreach ($this->mObList as $obj)
            {
                $obj->sendMessage();
            }
        }
         
    }
     
    /**
     * 通知类的接口类(观察者接口)
     */
    interface INotify
    {
        /**
         * 发送消息的功能
         */
        public function sendMessage();
    }
    /**
     * 邮件通知的类(观察者)
     */
    class Email implements INotify
    {
        /**
         * 以邮箱的方式发送消息
         */
        public $mEmail = '';
        public function __construct($email)
        {
            $this->mEmail = $email;
        }
        public function sendMessage()
        {
             echo $this->mEmail . '已经邮件通知!<hr/>';
        }   
    }
    //功能实现代码
    $observer = new Register();//实例化注册器
    //注册多个观察观
    $observer->registerObj(new Email('123@php20.com'));
    $observer->registerObj(new Email('234@php20.com'));
    $observer->registerObj(new Email('345@php20.com'));
    $observer->registerObj(new Email('456@php20.com'));
    $observer->registerObj(new Email('567@php20.com'));
    $observer->registerObj(new Email('678@php20.com'));
    //发送消息
    $observer->send();
    ?>


    执行结果:

    123@php20.com已经邮件通知!
    234@php20.com已经邮件通知!
    345@php20.com已经邮件通知!
    456@php20.com已经邮件通知!
    567@php20.com已经邮件通知!
    678@php20.com已经邮件通知!
  • 相关阅读:
    SpringBoot-Mysql模板多数据源加载
    SpringCloud-动态配置变化监控-获取变化(支持Config、Nacos)
    SpringBoot-ElasticJob封装快速上手使用(分布式定时器)
    关键字(标签)提示组件——拼音、汉字混合搜索
    写一个高性能的敏感词检测组件
    一个文件搞定Asp.net core 3.1动态页面转静态页面
    浅谈C#在网络波动时防重复提交
    对RC4算法进行改写,新的加密算法RCX。
    【ToolGood.Words】之【StringSearch】字符串搜索——基于BFS算法
    万能解决方案之彻底解决macOS cocoapods环境的所有问题
  • 原文地址:https://www.cnblogs.com/ghjbk/p/6670230.html
Copyright © 2020-2023  润新知