服务定位器模式(Service Locator)

服务定位器模式被一些人认为是一种反面模式。它违反了依赖倒置原则。该模式隐藏类的依赖,而不是暴露依赖(如果暴露可通过依赖注入的方式注入依赖)。当某项服务的依赖发生变化时,使用该服务的类的功能将面临被破坏的风险,最终导致系统难以维护。

4.2.1. 目的

服务定位器模式能够降低代码的耦合度,以便获得可测试、可维护和可扩展的代码。DI 模式和服务定位器模式是 IOC 模式的一种实现。

4.2.2. 用法

使用 ServiceLocator ,你可以为给定的 interface 注册一个服务。通过使用这个 interface,你不需要知道该服务的实现细节,就可以获取并在你应用中使用该服务。你可以在引导程序中配置和注入服务定位器对象。

4.2.3. 实例

Zend Framework2 使用服务定位器创建和共享框架中使用的服务(EventManager,ModuleManager,以及由模块提供的用户自定义服务等)

4.2.4. UML Diagram

[

](https://lccdn.phphub.org/uploads/images/201803/19/1/2pn0Utic36.png)

4.2.5. Code

你也可以在 GitHub 上查看此代码

ServiceLocator.php

namespace DesignPatterns\More\ServiceLocator;

class ServiceLocator

{

/**

* @var array

*/

private $services = [];

/**

* @var array

*/

private $instantiated = [];

/**

* @var array

*/

private $shared = [];

/**

* 相比在这里提供一个类,你也可以为接口存储一个服务。

*

* @param string $class

* @param object $service

* @param bool $share

*/

public function addInstance(string $class, $service, bool $share = true)

{

$this->services[$class] = $service;

$this->instantiated[$class] = $service;

$this->shared[$class] = $share;

}

/**

* 相比在这里提供一个类,你也可以为接口存储一个服务。

*

* @param string $class

* @param array $params

* @param bool $share

*/

public function addClass(string $class, array $params, bool $share = true)

{

$this->services[$class] = $params;

$this->shared[$class] = $share;

}

public function has(string $interface): bool

{

}

/**

* @param string $class

*

* @return object

*/

public function get(string $class)

{

if (isset($this->instantiated[$class]) && $this->shared[$class]) {

return $this->instantiated[$class];

}

$args = $this->services[$class];

switch (count($args)) {

case 0:

$object = new $class();

break;

case 1:

$object = new $class($args[0]);

break;

case 2:

$object = new $class($args[0], $args[1]);

break;

case 3:

$object = new $class($args[0], $args[1], $args[2]);

break;

default:

throw new \OutOfRangeException('Too many arguments given');

}

if ($this->shared[$class]) {

$this->instantiated[$class] = $object;

}

return $object;

}

}

LogService.php

namespace DesignPatterns\\More\\ServiceLocator;

class LogService

{

}

4.2.6. 测试

Tests/ServiceLocatorTest.php

namespace DesignPatterns\\More\\ServiceLocator\\Tests;

use DesignPatterns\\More\\ServiceLocator\\LogService;

use DesignPatterns\\More\\ServiceLocator\\ServiceLocator;

use PHPUnit\\Framework\\TestCase;

class ServiceLocatorTest extends TestCase

{

/**

* @var ServiceLocator

*/

private $serviceLocator;

public function setUp()

{

$this->serviceLocator = new ServiceLocator();

}

public function testHasServices()

{

$this->serviceLocator->addInstance(LogService::class, new LogService());

$this->assertTrue($this->serviceLocator->has(LogService::class));

$this->assertFalse($this->serviceLocator->has(self::class));

}

public function testGetWillInstantiateLogServiceIfNoInstanceHasBeenCreatedYet()

{

$this->serviceLocator->addClass(LogService::class, \[\]);

$logger = $this->serviceLocator->get(LogService::class);

$this->assertInstanceOf(LogService::class, $logger);

}

}

php service locator,服务定位器模式(Service Locator)相关推荐

  1. 三十六、服务定位器模式 (Service Locator Pattern)

    服务定位器模式(Service Locator Pattern)用于想使用 JNDI 查询定位各种服务的时候 考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术 在首次请求某 ...

  2. Java服务定位器模式

    服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候.考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术.在首次请 ...

  3. 避免在ASP.NET Core中使用服务定位器模式

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:服务定位器(Service Locator)作为一种反模式,一般情况下应该避免使用,在 ...

  4. Service Locator服务定位器

    先讲服务定位器, 有些摘录于 http://www.digpage.com/convention.html Service Locator目的也在于解耦他的模式非常贴合Web这种基于服务和组件的应用的 ...

  5. 设计模式 - 服务定位模式 Service Locator Pattern

    译者序:看 spring framework 时候了解到的 Service Locator 模式,顺便搜到了这篇文章,感觉很棒,顺手翻译下,好安利给其他小伙伴. 原文链接:http://gamepro ...

  6. php 服务定位,服务定位器(Service Locator)

    服务定位器 服务定位器是一个了解如何提供各种应用所需的服务(或组件)的对象.在服务定位器中,每个组件都只有一个单独的实例,并通过ID 唯一地标识.用这个 ID 就能从服务定位器中得到这个组件. 在 Y ...

  7. 自动化运维之k8s——Kubernetes集群部署、pod、service微服务、kubernetes网络通信

    目录 一.Kubernetes简介 1.Kubernetes简介 2.kubernetes设计架构 3.Kubernetes核心组件 4.kubernetes设计结构 二.Kubernetes部署 1 ...

  8. GoF--服务定位器模式

    服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候.考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术.在首次请 ...

  9. php service locator,Yii源码解读-服务定位器(ServiceLocator)

    SL的目的也是解耦,并且非常适合基于服务和组件的应用. Service Locator充当了一个运行时的链接器的角色,可以在运行时动态地修改一个类所要选用的服务, 而不必对类作任何的修改. 一个类可以 ...

最新文章

  1. 【廖雪峰python入门笔记】list_创建
  2. oracle数据库用户密码将要过期处理办法(ORA-28002)
  3. php概率计算_php 抽奖概率算法
  4. WebView内存泄露的解决方案
  5. 阿里云数据库自研产品亮相国际顶级会议ICDE 推动云原生数据库成为行业标准
  6. Oracle中start with xx connect by prior 语句解析
  7. const 常量_var,let,const 的区别?
  8. 2013年6月13日星期四
  9. 百科系列——高一所遇
  10. em表示什么长度单位_使用相对长度单位em布局网页内容
  11. 黑马程序员 手写xaml界面系统维护
  12. aforge 相机标定_在C#和WPF中使用Aforge.NET获取网络摄像头流
  13. 区块链技术在银行业的应用
  14. OpenWrt自定义luci页面来修改配置文件
  15. 收藏|史上最全最实用的运营工具库,你想要的都在!
  16. 两个正态总体方差比的置信区间
  17. Bellman-Ford与spfa算法
  18. 小程序动画-循环放大缩小的动画(一闪一闪的)
  19. 海龟画图 python太阳花_《海》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  20. gdpr通用数据保护条例_关于通用数据保护法规(GDPR),您需要了解的15件事

热门文章

  1. 计算机基础知识教程打印a4纸,一张A4纸如何打印多个准考证?_计算机办公软件基础...
  2. Unity3D关于如何使用iTween制作各种简易动画 (官方例子的解释)
  3. 2PSK,2DPSK编码
  4. 争夺存量用户关键战,助力企业构建完美标签体系丨01期直播回顾
  5. iOS UIKeyboardType(键盘类型)~图解
  6. MySql 5.7授权远程登陆
  7. 阿里巴巴资深架构师推荐:基于大中台小前台模式设计高并发电商架构
  8. 2016年WINLIN研发和团队计划
  9. C# asp.net .netcore 单层和双层PDF转为图片
  10. 图解大型互联网数据中心典型模型