牛逼plus!原来观察者模式竟然是这样用的
Posted autofelix
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛逼plus!原来观察者模式竟然是这样用的相关的知识,希望对你有一定的参考价值。
〝 古人学问遗无力,少壮功夫老始成 〞
观察者模式是编程设计程序中占比很重要的一种设计模式,他在生活中应用非常的广泛,但是很多初学编程的小伙伴,对如何使用它却知道的甚少,其实观察者模式简单来说,就是用来监控用户的某些操作,然后根据用户这些操作来处理一些后续的事情,也许这样说比较生硬,举个例子,比如一个用户去网上下单买电影票,付款成功后,系统需要发短信给用户,顺便记录用户购票的日志等其他一些逻辑操作,这种情况中,观察者模式其实就是监控用户买票的行为,然后系统需要针对这种情况处理的一些后续行为,这种行为就很像事后诸葛亮。
目录
一、定义观察者接口
- InterfaceObserver 这个接口是系统自带的观察者接口
- InterfaceObserver 默认需要实现onListen和getObserverName这两个方法,因为是系统默认的,所以可以不定义这两个方法,但是子类必须要实现这两个方法
- 如果是自定义观察者接口名,一定要实现onListen同功能的方法
<?php
/**
* Interface InterfaceObserver
* 观察者接口
*/
interface InterfaceObserver
{
public function onListen($sender, $args);
public function getObserverName();
}
二、定义可被观察者的接口
- 其实就是用来监听事件的发生
- InterfaceObservable 注意看,这个名字跟上面的观察者接口很像,但是其实是不一样的,别被名字弄晕了
- InterfaceObservable 需要实现两个方法,跟上面的观察者接口一样,也是系统默认的,所以也不可以不写出来,这里我写出来仅仅是为了让大家等会更好的理解什么是观察者模式
<?php
/**
* Interface InterfaceObservable
*/
interface InterfaceObservable
{
public function addObserver($observer);
public function removeObserver($observer_name);
}
三、监听用户购票事件
- 既然我们要观察事件的发生,那么肯定要实现InterfaceObservable接口
- addObserver 方法我们是用来依赖注入一些用户购票之后系统的操作
- removeObserver 方法,大家猜都猜的出来,是用来移除某个后续操作的,所以我们暂时不去实现
- buy 这个购票方法中,关于用户购票成功之前的逻辑不去实现,观察者模式关注的是用户购票成功后的操作
<?php
class Ticket implements InterfaceObservable
{
/**
* @var array
*/
private $_observers = [];
/**
* @param $observer
*/
public function addObserver($observer)
{
if ($observer instanceof InterfaceObserver) {
$this->_observers[] = $observer;
}
}
/**
* @param $observer_name
*/
public function removeObserver($observer_name)
{
}
/**
* 用户购票行为
*/
public function buy()
{
//用户购票逻辑,这里不详细说明,仅仅以参数代之
$result = [
'code' => 200,
'msg' => '用户购票成功',
'sign' => 'autofelix_20210421'
];
//侦查成功,开始诸葛亮操作
if($result['code'] == 200) {
foreach ($this->_observers as $observer) {
$observer->onListen($this, $result['sign']);
}
}
}
}
四、罗列出购票成功后系统的任务
- 既然是系统后续的处理方式,那么肯定要实现InterfaceObserver接口
- Listen 这个方法可以解释成,监听到了某件事的发生,而接下来需要怎么去做
<?php
/**
* 记录用户购票日志
* Class TicketRecord
*/
class ticketRecord implements InterfaceObserver
{
public function onListen($sender, $args)
{
echo "记录用户购票成功,编号为:{$args}<br/>";
}
public function getObserverName()
{
}
}
/**
* 给用户发送观影短信
* Class sendMsg
*/
class sendMsg implements InterfaceObserver
{
public function onListen($sender, $args)
{
echo "您的电影票购买成功,请凭编号:{$args}观影<br/>";
}
public function getObserverName()
{
}
}
五、注册观察者事件
<?php
$ticket = new Ticket();
$ticket->addObserver(new ticketRecord());
$ticket->addObserver(new sendMsg());
$ticket->buy();
//运行结果:
//记录用户购票成功,编号为:autofelix_20210421
//您的电影票购买成功,请凭编号:autofelix_20210421观影
六、纵观全局
- 在这个案例中,其实观察者模式就做了一件事,观察到用户购票成功事件之后,然后针对这种事情,接下来系统需要做哪些事情
- 通过这个案例,是不是很容易理解了什么是观察者模式,以及它在现实中的应用
<?php
/**
* Created by PhpStorm.
* User: autofelix
* Date: 1/23/21
* Time: 7:20 PM
* Desc: 观察者模式购票
*/
/**
* Interface InterfaceObserver
* 观察者接口
*/
interface InterfaceObserver
{
public function onListen($sender, $args);
public function getObserverName();
}
/**
* Interface InterfaceObservable
* 被观察对象接口
*/
interface InterfaceObservable
{
public function addObserver($observer);
public function removeObserver($observer_name);
}
class Ticket implements InterfaceObservable
{
/**
* @var array
*/
private $_observers = [];
/**
* @param $observer
*/
public function addObserver($observer)
{
if ($observer instanceof InterfaceObserver) {
$this->_observers[] = $observer;
}
}
/**
* @param $observer_name
*/
public function removeObserver($observer_name)
{
}
/**
* 用户购票行为
*/
public function buy()
{
//用户购票逻辑,这里不详细说明,仅仅以参数代之
$result = [
'code' => 200,
'msg' => '用户购票成功',
'sign' => 'autofelix_20210421'
];
//购票成功,开始后期处理
if($result['code'] == 200) {
foreach ($this->_observers as $observer) {
$observer->onListen($this, $result['sign']);
}
}
}
}
/**
* 记录用户购票日志
* Class TicketRecord
*/
class ticketRecord implements InterfaceObserver
{
public function onListen($sender, $args)
{
echo "记录用户购票成功,编号为:{$args}<br/>";
}
public function getObserverName()
{
}
}
/**
* 给用户发送观影短信
* Class sendMsg
*/
class sendMsg implements InterfaceObserver
{
public function onListen($sender, $args)
{
echo "您的电影票购买成功,请凭编号:{$args}观影<br/>";
}
public function getObserverName()
{
}
}
$ticket = new Ticket();
$ticket->addObserver(new ticketRecord());
$ticket->addObserver(new sendMsg());
$ticket->buy();
猜你喜欢:
以上是关于牛逼plus!原来观察者模式竟然是这样用的的主要内容,如果未能解决你的问题,请参考以下文章