什么是观察者模式?

什么是观察者模式?
简单的一句话就是,多个不同类去执行方法名相同的代码。

实现:1.定义一个观察接口,第二实现该接口里的方法。

生活中的例子:

小明观察者),狗(被观察者),猫(被观察者),牛(被观察者)
当小明看见狗,就知道它喜欢吃骨头。
当小明看见猫,就知道它喜欢吃鱼。
当小明看见牛,就知道它喜欢吃青草。
代码如下:

<?php

//观察者接口 
interface ObjectTest { 
  //注册观察者对象 
  public function register(ObServerTest $obServerTest);
  //删除观察者对象
  public function detach(ObServerTest $obServerTest);
  //通知所有的被观察者 
  public function notify();
} 

//被观察者接口 
interface ObServerTest{ 
  public function eat(); 
} 

//定义具体观察者类
class Action implements ObjectTest{ 
  private $_obServersTest = []; 
  public function register(ObServerTest $obServerTest){
    //注册对象
    $this->_obServersTest[] = $obServerTest;
  } 
  public function detach(ObServerTest $obServerTest){ 
    $index = array_search($obServerTest,$this->_obServersTest); 
    if(false === $index || !array_key_exists($index,$this->_obServersTest)){ 
      throw new \Exception('该对象不存在');
    } 
    unset($this->_obServersTest[$index]); 
  } 
  public function notify(){ 
  //通知所有的对象
  foreach ($this->_obServersTest as $k=>$v){ 
    $v->eat(); 
  } 
  } 
}

class Dog implements ObServerTest{
  public function eat() { echo '狗吃骨头'."\n"; }
} 
class Cat implements ObServerTest{
   public function eat() { echo '猫吃鱼'."\n"; 
  }
 } 
 class Pink implements ObServerTest{ 
  public function eat() { echo '猪吃了睡,睡了吃'."\n"; }
 } 

$action = new Action();
$action->register(new Dog()); 
$action->register(new Cat()); 
//$action->detach(new Cat()); //删除观察者对象
$action->register(new Pink());
$action->notify();
//结果: 狗吃骨头 猫吃鱼 猪吃了睡,睡了吃
//删除观察者对象猫类 结果: 狗吃骨头  猪吃了睡,睡了吃


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值