对于中高级php的面试,设计模式几乎是必问的一个环节。但是对于我这样的普通的phper来说可能很多时候都是码业务逻辑,功能又着急上线,几年下来也没法用到多少设计模式,本文就结合我日常的工作说说我对几个设计模式的理解(顺序我是根据我面试被问到的情况写的,遇到好几家都问用到了除了单例和工厂之外的设计模式)
1.观察者模式
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
例子:我之前在的旅游公司和电商公司,用到这个的地方就是订单完成(订单状态改变了)之后,需要给用户发邮件,也要发短信,后面有接口对接了还要调接口等等一系列操作。。
按照之前我写逻辑的话肯定就是
if($order[‘status‘]==1){
//订单完成
//发送短信(短信实现逻辑)
//发送邮件(邮件实现逻辑)
//发送接口(如果有产品是调用的别人的接口,进行相关接口逻辑)
}
这样写咋一看本身也没啥毛病,说实话很多小公司包括我之前写的话我也就是这样写。但是为啥我们要用到观察者模式呢,1.代码过于长所有的逻辑写在一起,改变其中一个就需要到这个if条件下去修改2.如果这时候又多了一个比如微信推送,按照现有的话肯定又是在这段代码下继续堆微信推送的逻辑。
其实这个时候观察者模式就有用武之地了,针对上面的情况,我写了下观察者模式的例子
//首先观察者模式的定义,就是一个对象状态发生改变,通知依赖于他的对象。
定义一个接口类Observer,有个方法update,我们所有的短信,邮件等等都implement这个接口
interface Observer
{
public function update();
}
class MsgOb implements Observer
{
function update()
{
echo ‘这里面实现短信逻辑‘;
}
}
class EmailOb implements Observer
{
function update()
{
echo ‘这里面实现邮件逻辑‘;
}
}
//观察者模式还需要一个事件Generator,需要实现加入观察者和通知相关观察者的功能
abstract class EventGenerator
{
protected $observer;
public function addObserver(Observer $observer)
{
$this->observer[] = $observer;
}
public function notify()
{
foreach ($this->observer as $_observer) {
$_observer->update();
}
}
}
//我们来重新看下,当应用观察者模式之后,我们订单状态改变
class OrderMachine extends EventGenerator
{
function trigger()
{
echo ‘订单状态改变‘;
$this->notify();
}
}
if($order[‘status‘]==1)
{
$order=new OrderMachine();
//加入短信逻辑
$order->addObserver(new MsgOb);
//加入邮件逻辑
$order->addObserver(new EmailOb);
//加入其它逻辑。。。
//事件发生,通知
$order->trigger();
}
//代码写完了,现在再看下上面我提的需求,如果这个时候再来个微信通知,我们是不是只要加一个微信通知观察者,加入观察就可以了而不必影响到其它的短信,邮件这些逻辑,而且没有必要修改其它的类了,不动用其它的逻辑了。同理要删除某个逻辑是不是也只要不把他加入观察者,注销上面的加入逻辑就行了
这就是面试中的一个模式,我结合自己的工作回答的情况。