所以我正在学习设计模式,我正在研究观察者模式。
为了在原始基础上实现它,我做了类似的事情:
<?php
class Subject
{
private $foo;
private $bar;
private $observers = [];
public function addObserver(Observer $o)
{
$this->observers[] = $o;
}
public function removeObserver(Observer $o)
{
if(($key = array_search($o, $this->observers, $TRUE)) !== FALSE) {
unset($this->observers[$key]);
}
}
public function notify()
{
foreach ($this->observers as $observer) {
$observer->update($this->foo, $this->bar);
}
}
public function setFoo($foo)
{
$this->foo = $foo;
}
public function setBar($bar)
{
$this->bar = $bar;
}
}
interface Observer{
function update($foo, $bar);
}
class Observer1 implements Observer
{
private $foo;
private $bar;
public function update($foo, $bar){
$this->foo = $foo;
$this->bar = $bar;
}
public function display()
{
echo "Observer1 : Foo -> " . $this->foo . " Bar -> " . $this->bar . "\n";
}
}
class Observer2 implements Observer
{
private $foo;
private $bar;
public function update($foo, $bar){
$this->foo = $foo;
$this->bar = $bar;
}
public function display()
{
echo "Observer2 : Foo -> " . $this->foo . " Bar -> " . $this->bar . "\n";
}
}
$subject = new Subject;
$observer1 = new Observer1;
$observer2 = new Observer2;
$subject->addObserver($observer1);
$subject->addObserver($observer2);
$subject->setFoo(5);
$subject->setBar(10);
$subject->notify();
$observer1->display();
$observer2->display();
$subject->setFoo(20);
$subject->setBar(40);
$subject->notify();
$observer1->display();
$observer2->display();
所以我看到观察者正在更新。这是实现观察者模式的正确方法吗?我想我可以抽象Subject中的功能来添加,删除和通知它自己的抽象类。我还可以使用PHP提供的SplSubject
和SplObserver
。还有什么办法可以使这段代码变得更好?
但我真正想知道的是Laravel中使用的观察者模式在哪里。它必须在框架中的某个地方使用,我可以从中学习。其次,这有什么实际应用?我能想到的一件事是,当我在laravel中进行缓存并且模型得到更新时,可能需要通知缓存对象进行更改。这是一个很好的实际应用模式吗?其他人在那里?
答案 0 :(得分:0)
在我的项目中,我使用Observers来检查模型是否已更改,如果已进行更改则抛出事件。
假设我的用户模型有Observer,因此UserObserver。观察者所做的是检查用户的变化。如果有变化。
我有一个事件处理程序来保存事务。
E.g“John Doe已将他的名字从迈克更新为约翰”
其中名字是我的用户模型中名为first_name的字段;观察者有更多,一个是我的申请。