zoukankan      html  css  js  c++  java
  • 观察者模式

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

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

    [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已经邮件通知!
  • 相关阅读:
    android如何与asp.net服务端共享session
    WCF 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的
    PHP 实现单一入口 apache配置
    action func用法记记
    NETCore Bootstrap Admin 通用后台管理权限 [1]: 前后台分离系统简介
    开源 一套 Blazor Server 端精致套件
    NETCore Bootstrap Admin 通用后台管理权限 [3]: 精简版任务调度模块
    NETCore Bootstrap Admin 通用后台管理权限 [2]: Blazor 版本介绍
    C#服务器全面讲解与制作
    批量生成二维码
  • 原文地址:https://www.cnblogs.com/ghjbk/p/6670230.html
Copyright © 2011-2022 走看看