什么是服务器定位模式,如何使用?

什么是服务器定位模式,如何使用?

什么是服务器定位模式?

**服务定位模式(Service Locator Pattern)**是一种软件开发中的设计模式,通过应用强大的抽象层,可对涉及尝试获取一个服务的过程进行封装。该模式使用一个称为"Service Locator"的中心注册表来处理请求并返回处理特定任务所需的必要信息。其包含各服务的引用,并且封装了定位服务的逻辑。在类中使用 Service Locator 来获取所需服务的实例。

image.png

Service Locator 模式并不描述如何实例化服务,其描述了一种注册和定位服务的方式。通常情况下,Service Locator 模式与工厂模式(Factory Pattern)和依赖注入模式(Dependency Injection Pattern)等结合使用。服务定位器(通常 ServiceLocator 类提供 IServiceLocator 接口的实现单例,并负责管理该实例的创建和访问。ServiceLocator 类提供 IServiceLocator 接口的默认实现,例如 ActivatingServiceLocator 类,可以同时创建和定位服务)能够在不知道抽象类的具体类型的情况下定位到服务。例如,它可能会使用字符串或服务接口类型来影射服务,这允许在无需修改类的条件下替换依赖项的具体实现。

服务定位器模式的目标?

在以下场景中:某类ClassA依赖于服务ServiceA和服务ServiceB,服务的具体类型需在编译时指定。

image.png

这种条件下有以下缺点:

  • 尝试替换或更新依赖项,必须更改类的源代码并且重新编译。
  • 依赖项的具体实现必须在编译时可用。
  • 测试该类非常困难,因为类对依赖项有直接的引用,则依赖项不能使用Stub或Mock对象替换。
  • 该类包含用于创建、定位和管理依赖项的重复代码。

使用 Service Locator Pattern 来达成以下目标:

  • 把类与依赖项解耦,从而使这些依赖项可被替换或者更新。
  • 类在编译时并不知道依赖项的具体实现。
  • 类的隔离性和可测试性非常好。
  • 类无需负责依赖项的创建、定位和管理逻辑。
  • 通过将应用程序分解为松耦合的模块,达成模块间的无依赖开发、测试、版本控制和部署。

服务定位器模式用在使用 Java命名与目录接口-JNDI(Java Naming and Directory Interface, Java命名和目录接口) 查询定位各种服务的时候,该模式充分利用了缓存技术。在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象。当再次请求相同的服务时,服务定位器会在缓存中查找。服务定位器模式包含:

  • 服务(Service):实际处理请求的服务。对这种服务的引用可以在 JNDI 服务器中查找到;
  • Context:JNDI Context 带有对要查询的服务的引用;
  • 服务定位器(Service Locator):服务定位器是通过 JNDI 查找和缓存服务来获取服务的单点接触;
  • 缓存(Cache):缓存存储服务的引用,以便复用;
  • 客户端(Client):通过 ServiceLocator 调用服务的对象;