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已经邮件通知!
  • 相关阅读:
    Activity工作流(2)-入门安装运行第一个例子
    三分钟明白 Activiti工作流 -- java运用
    java 实现一套流程管理、流转的思路(伪工作流) 【仅供参考】
    jquery 的 each 方法中 return 的坑
    js判断数组里是否有重复元素的方法
    JFreeChart工具类
    JQuery中$.each 和$(selector).each()的区别详解
    echarts彩虹柱状图 每个bar显示不同颜色, 标题在不同位置 ,工具中有可以直接保存为图片下载,平均线的添加
    poi导出word表格详解 超详细了
    java使用POI操作XWPFDocument中的XWPFRun(文本)对象的属性详解
  • 原文地址:https://www.cnblogs.com/ghjbk/p/6670230.html
Copyright © 2011-2022 走看看