PHP设计模式学习笔记: 观察者模式

本文深入探讨了观察者模式的原理与应用,通过实例展示了如何在PHP中实现这一模式,以及其在软件设计中的作用。

// 抽象的观察者类,规定要有一个update方法
abstract class AbstractObserver {
    abstract function update(AbstractSubject $subject_in);
}

// 抽象的主题类
abstract class AbstractSubject {
    abstract function attach(AbstractObserver $observer_in);
    abstract function detach(AbstractObserver $observer_in);
    abstract function notify();
}

function writeln($line_in) {
    echo $line_in.PHP_EOL;
}

// 观察者类的子类
class FruitbuyerObserver extends AbstractObserver {
    public function __construct() {
    }
    public function update(AbstractSubject $subject) {
      writeln('新的最喜爱的水果是: '.$subject->getFavorites());
    }
}

// 主题类的子类
class FruitbuyerSubject extends AbstractSubject {
    private $favoritePatterns = NULL;
    private $observers = array();

    function __construct() {
    }

    function attach(AbstractObserver $observer_in) {
      $this->observers[] = $observer_in;
    }

    function detach(AbstractObserver $observer_in) {
      foreach($this->observers as $okey => $oval) {
        if ($oval == $observer_in) { 
          unset($this->observers[$okey]);
        }
      }
    }

    function notify() {
      foreach($this->observers as $obs) {
        $obs->update($this);
      }
    }

    function updateFavorites($newFavorites) {
      $this->favorites = $newFavorites;
      $this->notify();
    }

    function getFavorites() {
      return $this->favorites;
    }
}

  writeln('开始测试观察者模式');
  writeln('');

  $fruitbuyer = new FruitbuyerSubject();
  $fruitbuyerObserver = new FruitbuyerObserver();

  // 把一个观察者放进$fruitbuyer的已知观察者名单中,现在$fruitbuyer有了一个观察者对象
  $fruitbuyer->attach($fruitbuyerObserver );

  // 这步是关键,先把“苹果”加入水果买家的最爱列表
  // 接着该updateFavorites()操作会调用已注册的(目前只有一个)所有观察者自身的update()方法
  // 就是说告知(notify)所有的观察者们,让他们都知道$fruitbuyer最喜欢的水果是“苹果”
  $fruitbuyer->updateFavorites('苹果');      

  // 现在换成了西瓜,$fuitbuyer一旦更改了喜好,同时会告知所有的观察者们,现在观察者们也知道了新的喜好是“西瓜”
  $fruitbuyer->updateFavorites('西瓜');

  // 去掉一个观察者
  $fruitbuyer->detach($fruitbuyerObserver );

  // 现在因为没有了观察者,所以$fruitbuyer更新了喜好为黄瓜,但是能通知谁呢?没人知道他喜欢的是“黄瓜”了哦~~~
  $fruitbuyer->updateFavorites('黄瓜');

  writeln('');
  writeln('结束测试观察者模式');



结果:

开始测试观察者模式

新的最喜爱的水果是: 苹果
新的最喜爱的水果是: 西瓜

结束测试观察者模式







转载于:https://my.oschina.net/ecnu/blog/289294

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值