列举一个场景:下班之后回家,打开家门,开始做饭,之后睡觉
以上场景如果按照传统的开始方式就是封装一个用户类,里面有回家方法,打开门方法,做饭方法,睡觉方法,之后在外面依次调用。
假设你代码开发完了,这时需求变了,变为:下班之后回家,打开家门,开始做饭,运动,打游戏,之后睡觉
一段时间后又变了:打开家门,运动,打游戏,之后睡觉
随着需求变动,代码维护性约来越差,最后维护起来很困难
如果使用观察者模式就很好的解决了这个问题。
观察者模式:一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。(度娘的解释)
个人理解观察者模式就是观察者的类统一实现观察者收到通知的方法(方法A),而被观察者则要有增加观察者的方法(方法B),之后在被观察者调用了B后通知观察者们来执行A,这样代码的耦合性很低
下面直接上代码
1 <?php
2 /**
3 * @desc 观察者模式
4 * Created by PhpStorm.
5 * User: zzq
6 * Date: 2019-02-12
7 * Time: 10:41
8 */
9 //观察者接到消息后要执行的方法
10 interface oberver{
11 function prevToDo();
12 }
13 //被观察者接口,里面只有增加观察者的方法
14 interface observable{
15 function addObserver($observer); 16 } 17 class goHome implements observable{ 18 private $observers = array(); 19 public function startGoHome(){ 20 echo '下班回家';echo PHP_EOL; 21 foreach ( $this->observers as $observer ) { 22 $observer->prevToDo(); 23 } 24 } 25 public function addObserver($observer){ 26 // TODO: Implement addObserver() method. 27 $this->observers[] = $observer; 28 } 29 } 30 class openDoor implements oberver{ 31 32 function prevToDo(){ 33 // TODO: Implement prevToDo() method. 34 echo '打开门锁';echo PHP_EOL; 35 } 36 } 37 class cook implements oberver{ 38 39 function prevToDo(){ 40 // TODO: Implement prevToDo() method. 41 echo '开始做饭';echo PHP_EOL; 42 } 43 } 44 class sleep implements oberver{ 45 46 function prevToDo(){ 47 // TODO: Implement prevToDo() method. 48 echo '开始睡觉';echo PHP_EOL; 49 } 50 } 51 $goHome = new goHome(); 52 $goHome->addObserver(new openDoor()); 53 $goHome->addObserver(new cook()); 54 $goHome->addObserver(new sleep()); 55 56 $goHome->startGoHome();
最终输出结果
下班回家
打开门锁
开始做饭
开始睡觉