PHP设计模式 四
4 观察者模式 SplSubject&SplObserver
观察者模式详解:
PHP设计模式(三) 观察者模式
SplSubject和SplObserver是系统自带的方法,用于观察者模式实现。
代码实现
基础类
classBaseEventimplementsSqlSubject{protected $observers;protected $name;publicfunction__construct($name){$this->name = $name; }//增加观察者publicfunctionattach(\SplObserver $observer){$this->observers[] = $observer; }//减少观察者publicfunctiondetach(\SplObserver $observer){ $key = array_search($observer,$this->observers, true);if($key){unset($this->observers[$key]); } }//通知观察者publicfunctionnotify(){foreach ($this->observers as $value) { $value->update($this); } }}
接口相关类
classLoginextendsController{//短信登录 控制层publicfunctionsmslogin(){ $param = request()->getParam(); $l_login = new loginlogic(); $result = $l_login->smslogin($param); response()->send($result); }}classloginlogic{//短信登录 逻辑层publicfunctionsmslogin($array){ $phone = $arr['phone']; $pwd = $arr['pwd']; $s_user_login = new UserLoginServer("user_login"); $s_user_login->attach(new SmsLoginObserver()); $s_user_login->attach(new UserExpLoginObserver()); $userinfo = $s_user_login->dologin($phone,$pwd);returnnew Reaponse(1,'登录成功',$userinfo); }}
服务类
//短信登录 服务层classUserLoginServerextendsBaseEvent{private $userinfo;publicfunctiondologin(string $phone,string $pwd){$this->phone = $phone//to do 登录逻辑 获取用户信息 $userinfo = $this->getUserinfo($phone,$pwd);$this->notify();return$this->userinfo; }publicfunctiongetuserinfo(){return$this->userinfo; }}
监听类
classSmsLoginObserverimplementsSplObserver{//登录成功后发送短信publicfunctionupdate(\SplSubject $subject){ $userinfo = $subject->getuserinfo(); $userid = $userinfo['id']; $phone = $userinfo['phone']; $name = $userinfo['name']; $login_ip = $userinfo['login_ip']; $last_login_time = $userinfo['last_login_time']; $s_sms = new SmsServer(); $content = $this->getconent($name,$login_ip,$last_login_time); $s_sms->send($phone,$content); Log::info("用户[".$userid."]登录成功,发短信到".$phone) ; }//获取短信发送内容privatefunctiongetconent($name,$login_ip,$last_login_time){ $conent = $name." ".$login_ip." ".$last_login_time;return $conent; }}classUserExpLoginObserverimplementsSplObserver{//登录成功后增加积分publicfunctionupdate(\SplSubject $subject){ $userinfo = $subject->getuserinfo(); $userid = $userinfo['id']; $num =1;$this->addexp($userid,$num); Log::info("增加用户[".$userid."]积分".$num) ; }}
SplSubject
官方文档
https://www.php.net/manual/zh/class.splsubject.php
SplObserver
官方文档
https://www.php.net/manual/zh/class.splobserver.php