当前位置: 首页 > 后端技术 > PHP

【PHP实现设计模式】ServiceLocator模式

时间:2023-03-30 01:33:15 PHP

什么是ServiceLocatorServiceLocator(服务定位器)知道如何定位(创建或获取)一个应用程序需要的服务,服务使用者在实际中并不需要使用它use关心服务的实际实现。效果如何?实现服务用户与服务的解耦,无需更改代码,仅通过简单的配置和服务变更即可实现。UML图代码示例classServiceLocator{/***服务实例索引*/private$_services=[];/***服务定义索引*/private$_definitions=[];/***全局服务共享(单例模式)*/private$_shared=[];公共函数有($id){返回isset($this->_services[$id])||isset($this->_definitions[$id]);}公共函数__get($id){if($this->has($this->id)){$this->get($id);}//另一个实现}publicfunctionget($id){if(isset($this->_services[$id])&&$this->_shared[$id]){return$this->_services[$id];}if(isset($this->_definitions[$id])){//实例化$definition=$this->_definitions[$id];$object=Creator::createObject($definition);//省略服务实例化实现if($this->_shared[$id]){$this->_services[$id]=$object}返回$对象;}thrownewException("Unabletolocateservice{$id}")}publicfunctionset($id,$definition,$share=false){if($definition===null){unset($this->_services[$id],$this->_definitions[$id]);返回;}unset($this->_services[$id]);$this->_shared[$id]=$share;如果(is_string($definition)){返回$this->_definitions[$id]=$definition;}if(is_object($definition)||is_callable($definition,true)){return$this->_definitions[$id]=$definition;}if(is_array($definition)){if(isset($definition['class'])){return$this->_definitions[$id]=$definition;}}thrownewException("服务添加失败");}}感谢文中图片来源网络http://designpatternsphp.read...