php面试之设计模式1:观察者模式

2021-02-12 15:15

阅读:558

标签:fun   serve   依赖   ace   nts   包括   观察   结合   面试   

对于中高级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();
  }
  //代码写完了,现在再看下上面我提的需求,如果这个时候再来个微信通知,我们是不是只要加一个微信通知观察者,加入观察就可以了而不必影响到其它的短信,邮件这些逻辑,而且没有必要修改其它的类了,不动用其它的逻辑了。同理要删除某个逻辑是不是也只要不把他加入观察者,注销上面的加入逻辑就行了
  
  这就是面试中的一个模式,我结合自己的工作回答的情况。

  

 

  

 

php面试之设计模式1:观察者模式

标签:fun   serve   依赖   ace   nts   包括   观察   结合   面试   

原文地址:https://www.cnblogs.com/leihuang/p/13030430.html


评论


亲,登录后才可以留言!