Пример #1
0
 /**
  *
  */
 public function testObserverCanBeAttachedAndDetach()
 {
     $subject = new Subject();
     $observerA = $this->getMockForAbstractClass('\\SplObserver');
     $subject->attach($observerA);
     $observerB = $this->getMockForAbstractClass('\\SplObserver');
     $subject->attach($observerB);
     $subject->detach($observerB);
     $this->assertContains($observerA, $subject->getObservers());
     $this->assertNotContains($observerB, $subject->getObservers());
 }
Пример #2
0
 public function __construct()
 {
     $subject = new Subject();
     $o1 = new Observer1();
     $o2 = new Observer2();
     $o3 = new Observer3();
     $subject->setData('Data for each 3 attached observers!');
     $subject->attach($o1);
     $subject->attach($o2);
     $subject->attach($o3);
     $subject->notify();
     $subject->detach($o3);
     $subject->setData('Data not for 3rd detached one!');
     $subject->notify();
 }
Пример #3
0
 /**
  * @group fakeobject
  */
 public function testUpdateIsCalledOnce()
 {
     // 建立一個 Observer 的 Mock Object
     $observer = $this->getMock('Observer');
     // 預期 Observer::update 方法應該只跑一次
     // 而傳入 update 方法的參數值為 something
     $observer->expects($this->once())->method('update')->with($this->equalTo('something'));
     $subject = new Subject();
     $subject->attach($observer);
     // 我們預測這裡會呼叫 Observer::update() 一次
     $subject->doSomething();
 }
Пример #4
0
    public function notify()
    {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }
    public function increaseValue($increaseBy)
    {
        $this->value += $increaseBy;
        $this->notify();
    }
    public function getValue()
    {
        return $this->value;
    }
}
class ValueObserver implements SplObserver
{
    public function update(SplSubject $subject)
    {
        if ($subject->getValue() > 20) {
            echo "Value is greater than 20!";
        }
    }
}
$subject = new Subject();
$subject->attach(new ValueObserver());
$subject->increaseValue(10);
$subject->increaseValue(10);
$subject->increaseValue(10);
$subject->increaseValue(10);
Пример #5
0
<?php

namespace Observer;

require_once 'AbstractObserver.php';
require_once 'AbstractSubject.php';
require_once 'Observer.php';
require_once 'Subject.php';
$patternGossiper = new Subject();
$patternGossipFan = new Observer();
$patternGossiper->attach($patternGossipFan);
$patternGossiper->updateFavorites('abstract factory, decorator, visitor');
$patternGossiper->updateFavorites('abstract factory, observer, decorator');
$patternGossiper->detach($patternGossipFan);
$patternGossiper->updateFavorites('abstract factory, observer, paisley');
Пример #6
0
 public static function test()
 {
     $subject = new Subject();
     $subject->attach(new Observer1());
     $subject->attach(new Observer2());
     $subject->post();
     //输出:数据量加1 积分加10
 }
Пример #7
0
    {
        return $this->_value;
    }
}
/**
 * 观察者1
*/
class Observer1 implements SplObserver
{
    public function update(SplSubject $subject)
    {
        echo '<b>对象</b>:</b>' . get_class() . ' <b>内容:</b>' . $subject->getValue() . '<br />';
    }
}
/**
 * 观察者2
*/
class Observer2 implements SplObserver
{
    public function update(SplSubject $subject)
    {
        echo '<b>对象:</b>' . get_class() . ' <b>内容:</b>' . $subject->getValue() . '<br />';
    }
}
//实现
$subject = new Subject();
$object1 = new Observer1();
$object2 = new Observer2();
$subject->attach($object1);
$subject->attach($object2);
$subject->setValue('这是内容');
Пример #8
0
        if ($id = array_search($observer, $this->observers, true)) {
            unset($this->observers[$id]);
        }
    }
    public function notify()
    {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }
    public function setValue($value)
    {
        $this->value = $value;
        $this->notify();
    }
    public function getValue()
    {
        return $this->value;
    }
}
class Observer implements SplObserver
{
    public function update(SplSubject $subject)
    {
        echo '<p>Новое значение равно: ' . $subject->getValue() . '</p>';
    }
}
$subject = new Subject();
$observer = new Observer();
$subject->attach($observer);
$subject->setValue(5);
Пример #9
0
{
    protected $observers = array();
    public function attach(SplObserver $observer)
    {
        $this->observers[] = $observer;
    }
    public function detach(SplObserver $observer)
    {
        $key = array_search($observer, $this->observers);
        if ($key) {
            unset($this->observers[$key]);
        }
    }
    public function notify()
    {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }
}
class MyObserver implements SplObserver
{
    public function update(SplSubject $subject)
    {
        echo "I was updated by " . get_class($subject);
    }
}
$subject = new Subject();
$subject->attach(new MyObserver());
$subject->notify();
// prints "I was updated by Subject"
Пример #10
0
 /**
  * @param Subject $subject
  */
 public function __construct(Subject $subject = null)
 {
     if (!empty($subject)) {
         $subject->attach($this);
     }
 }
Пример #11
0
 /**
  * Same as {@link Subject::attach}, but it takes only one argument and
  * that argument must be a class which implements the SplObserver interface.
  */
 public function attach(SplObserver $obj)
 {
     return parent::attach($obj);
 }