java 服务定位器模式_【PHP 实现设计模式】之服务定位器模式

什么是服务定位器

服务定位器(service locator)他知道如何定位(创建或者获取)一个应用所需要的服务,服务使用者在实际使用中无需关心服务的实际实现。

有什么作用

实现服务使用者和服务的解耦,无需改变代码而只是通过简单配置更服服务实现。

UML图示

02e6a6fb82ee98cce29911b4d01a5fab.png

代码示例

class ServiceLocator {

/**

* 服务实例索引

*/

privite $_services = [];

/**

* 服务定义索引

*/

private $_definitions = [];

/**

* 是否全局服务共享(单例模式)

*/

private $_shared = [];

public function has($id){

return isset($this->_services[$id]) || isset($this->_definitions[$id]);

}

public function __get($id){

if($this->has($this->id)){

$this->get($id);

}

// another implement

}

public function get($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

}

return $object;

}

throw new Exception("无法定位服务{$id}")

}

public function set($id,$definition,$share = false){

if ($definition === null) {

unset($this->_services[$id], $this->_definitions[$id]);

return;

}

unset($this->_services[$id]);

$this->_shared[$id] = $share;

if (is_string($definition)) {

return $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;

}

}

throw new Exception("服务添加失败");

}

}

感谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值