zoukankan      html  css  js  c++  java
  • php设计模式之观察者模式

    观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

    观察者模式中最主要的两类对象是:观察者和被观察者。

    在实际业务中被观察者往往是某些逻辑处理类,而观察者往往相当于一个通知人,可以是某个场景或业务操作,去注册和通知这些被观察者采取行动(update)。这种模式使得业务和逻辑分离,减少耦合,让代码更加高效。请看下面我的代码去更好的理解吧。

    <?php
    
    /**
    * 观察者模式
    * 假设我们的场景是参加某促销活动的用户扣积分并返现,并提高等级。
    *
    **/
    
    /**
    * 观察者需要实现的接口
    **/
    interface Observerable{
    public function update();
    }
    
    /**
    * 积分类 处理积分扣除
    **/
    
    class Points implements Observerable{
    public function update() {
    echo '扣除积分' , "<br/>";
    }
    }
    
    /**
    * 账单类 处理返现,这里就reback 10 rmb
    **/
    
    class Checkouts implements Observerable{
    public function update() {
    echo '返现10rmb' , "<br/>";
    }
    
    }
    
    /**
    * 用户等级类 处理用户等级。
    **/
    
    class Ranks implements Observerable{
    public function update() {
    echo '提高等级一级' , "<br/>";
    }
    }
    
    /**
    * 促销类 
    **/
    class Promotion {
    private $observers = array();
    
    public function register(Observerable $o) { // 注册观察者
    array_push($this->observers, $o);
    }
    
    public function notify() { // 通知观察者们开始各自更新操作
    if (empty($this->observers)) die('没有任何操作可言');
    foreach ($this->observers as $o) {
    $o->update(); // 进行更新
    }
    }
    }
    
    // --------------------客户端调用--------
    $promotion = new Promotion();
    $promotion->register(new Points());
    $promotion->register(new Checkouts());
    $promotion->register(new Ranks());
    $promotion->notify();
    
    // out print 
    /**扣除积分
    返现10rmb
    提高等级一级**/
  • 相关阅读:
    软件工程——结构化方法
    静态变量的坑
    OpenCV中对Mat的遍历访问与赋值
    SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0
    Ext.Net中的Task控件的使用
    字符集越界 正则表达式匹配车牌
    [TOEIC] 2013年12月25日托业考试总结
    WebKit 内容整理
    [C#/.NET]how to implement web application localization in .net 4.0
    C# 代码为什么比 C++代码 编译速度快?
  • 原文地址:https://www.cnblogs.com/freephp/p/4853912.html
Copyright © 2011-2022 走看看