什麼是觀察者模式
當一個物件狀態傳送改變時,依賴它的物件全部會受到通知,並自動更新。觀察者模式實現了低耦合的通知機制。
可用於通知或更新操作,進行解耦,避免在原來程式碼上修改邏輯程式碼。
觀察者模式場景
一個事件發生後,要執行一連串更新操作。傳統的方式就是在事件的程式碼後加入處理邏輯,當更新的邏輯增多之後,程式碼會變得難以維護。這種方式是耦合的,增加新的邏輯或刪除舊的邏輯需要修改事件的主體程式碼。
觀察者模式的實現
<?php
/**
* 事件生成器
* Class EventGenerator
*/
abstract class EventGenerator
{
private $observes = [];// 觀察者陣列
/**
* 新增觀察者
* @param Observe $observe
*/
public function addObserve(Observe $observe)
{
$this->observes[] = $observe;
}
/**
* 通知
*/
public function notify()
{
foreach ($this->observes as $observe) {
$observe->update();
}
}
}
/**
* 觀察者介面
* Interface Observe
*/
interface Observe
{
public function update();
}
/**
* 事件
* Class User
*/
class User extends EventGenerator
{
/**
* 傳送通知
*/
public function send()
{
echo '給使用者傳送通知...';
$this->notify();
echo '傳送成功!';
}
}
/**
* 郵件觀察者
* Class EmailObserve
*/
class EmailObserve implements Observe
{
public function update()
{
// TODO: Implement update() method.
echo '傳送郵件...';
// 郵件傳送邏輯...
echo '郵件傳送成功...';
}
}
/**
* 簡訊觀察者
* Class SMSObserve
*/
class SMSObserve implements Observe
{
public function update()
{
// TODO: Implement update() method.
echo '傳送簡訊...';
// 簡訊傳送邏輯...
echo '簡訊傳送成功...';
}
}
$user = new User();
// 新增觀察者
$user->addObserve(new EmailObserve());
$user->addObserve(new SMSObserve());
// 傳送
$user->send();
執行結果:
E:\php_project\設計模式\Lemon_lyue>php Observe.php
給使用者傳送通知...傳送郵件...郵件傳送成功...傳送簡訊...簡訊傳送成功...傳送成功!
更多內容關注個人部落格:lemonlyue.github.io/
本作品採用《CC 協議》,轉載必須註明作者和本文連結