设计模式--观察者模式
2019-03-20 本文已影响0人
ysp123
观察者模式,当一个对象的状态发生改变时,依赖它的对象会全部收到通知,并自动更新。
场景:一个事件发生后,触发一系列的更新操作,实现低耦合,非入侵式的通知和更新。
了解基本概念,上代码:
//观察者模式,事件绑定
class PluginA implements SplObserver{
function update(\SplSubject $subject){
if($subject->event == 'register'){
echo "plugin A observer register".PHP_EOL;
}
}
}
class PluginB implements SplObserver{
function update(\SplSubject $subject){
if($subject->event == 'register'){
echo "plugin A observer register".PHP_EOL;
}
if($subject->event == 'login'){
echo "plugin A observer login".PHP_EOL;
}
}
}
class Observer implements SplObserver{
public $config = [];
public function __construct($config){
foreach($config as $plugin => $events){
foreach($events as $event){
$this->config[$event][] = $plugin;
}
}
}
public function update(\SplSubject $subject){
if(array_key_exists($subject->event, $this->config)){
foreach($this->config[$subject->event] as $plugin){
$object = new $plugin();
$object->update($subject);
}
}
}
}
class User implements SplSubject{
public $event;
private $observers = [];
public $user = [];
public $observer;
public function register(){
$this->event = 'register';
$this->notify();
}
public function login(){
$this->event = 'login';
$this->notify();
}
public function attach(\SplObserver $observer){
$this->observer = $observer;
}
public function detach(\SplObserver $observer){
$this->observer = null;
}
public function notify(){
$this->observer->update($this);
}
}
$user = new User();
$config = [
'PluginA' => ['register'],
'PluginB' => ['register','login'],
];
$observer = new Observer($config);
$user->attach($observer);
$user->register();
$user->login();
观察者模式,订单支付场景应用:
interface ITicketObserver{ //观察者接口
function BuyTicketOver($sender, $args);
}
interface ITicketSubject{
function addObserver($observer);
}
class BuyMSM implements ITicketObserver{
function BuyTicketOver($sender, $ticket){
echo(date( 'Y-m-d H:i:s' ) . " 短信日志记录:购票成功:$ticket<br>".PHP_EOL);
}
}
class BuyEmail implements ITicketObserver{
function BuyTicketOver($sender, $ticket){
echo(date( 'Y-m-d H:i:s' ) . " 邮件通知记录:购票成功:$ticket<br>".PHP_EOL);
}
}
class BuyPrivilege implements ITicketObserver{
function BuyTicketOver($sender, $ticket){
echo(date( 'Y-m-d H:i:s' ) . " 优惠券使用记录:购票成功:$ticket<br>".PHP_EOL);
}
}
/***
* 主题
*/
class subject implements ITicketSubject{
public $observer = [];
public function addObserver($observer){
$this->observer[] = $observer;
}
public function notify(){
foreach($this->observer as $key => $obser){
$obser->BuyTicketOver('123','观影');
}
}
}
$subject = new subject();
$subject->addObserver(new BuyMSM());
$subject->addObserver(new BuyEmail());
$subject->addObserver(new BuyPrivilege());
$subject->notify();