设计模式-观察者模式
/** * * * 买票 * 记录购买信息 * 送优惠卷 * 短信日志记录 * 文本日志 * */由于原文是使用JAVA来实现 , 下面我用phpSPL工具 来实现观察者模式 实现这个案例/** * 构建主题, 用于发送通知 * * * */class buyTicket implements SplSubject {private $ticket;private $storage;function __construct (){$this->storage = new SplObjectStorage();}function attach( SplObserver $object ){$this->storage->attach($object);}function detach( SplObserver $object ){$this->storage->detach($object);}function notify(){foreach ( $this->storage as $obs ){$obs->update( $this );}}/** * 买票成功 * 发送通知记录日志 * 送折扣劵 * * @return buyTicket */function buyTicket(){$this->ticket = 'NO.12, $100.';$this->notify();}function getTicket(){return $this->ticket;}}/** * 接收通知的观察者 * 判断通知来源, 并且相应观察者执行相应的操作 * */abstract class ticketObject implements SplObserver {private $buyTicket;function __construct( buyTicket $buyTicket ){$this->buyTicket = $buyTicket;$buyTicket->attach( $this );}function update( SplSubject $subject ) {if( $subject === $this->buyTicket ){$this->doUpdate( $subject );}}abstract function doUpdate( SplSubject $buyTicket );}/** * * 日志观察者接到通知记录日志 * */class ticketLogger extends ticketObject {function doUpdate( SplSubject $buyTicket ){print __CLASS__.' 日志计入 买票 '.$buyTicket->getTicket()."\n";}}/** * * 折扣劵观察者 接到通知发送折扣劵 * */class ticketDid extends ticketObject {function doUpdate( SplSubject $buyTicket ){print __CLASS__."\t 送10元折扣卷一张".$buyTicket->getTicket();}}$ticket = new buyTicket();new ticketLogger( $ticket );new ticketDid( $ticket );$ticket->buyTicket();