Java服务定位器模式

服务定位器模式用于通过JNDI高效查找服务,首次请求时在JNDI中查找并缓存服务,提高性能。本文介绍了模式的实体如服务、上下文、定位器和缓存,并通过示例代码展示了其实现过程。

服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候。考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术。在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象。当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能。以下是这种设计模式的实体。

• 服务(Service) - 实际处理请求的服务。对这种服务的引用可以在 JNDI 服务器中查找到。

• Context / 初始的 Context - JNDI Context 带有对要查找的服务的引用。

• 服务定位器(Service Locator) - 服务定位器是通过 JNDI 查找和缓存服务来获取服务的单点接触。

• 缓存(Cache) - 缓存存储服务的引用,以便复用它们。

• 客户端(Client) - Client 是通过 ServiceLocator 调用服务的对象。

实现
我们将创建 ServiceLocator、InitialContext、Cache、Service 作为表示实体的各种对象。Service1 和 Service2 表示实体服务。

ServiceLocatorPatternDemo,我们的演示类在这里是作为一个客户端,将使用 ServiceLocator 来演示服务定位器设计模式。
image.png
步骤 1

创建服务接口 Service。

public interface Service {
public String getName();
public void execute();
}
步骤 2

创建实体服务。

public class Service1 implements Service {
public void execute(){
System.out.println(“Executing Service1”);
}

@Override
public String getName() {
return “Service1”;
}
}
public class Service2 implements Service {
public void execute(){
System.out.println(“Executing Service2”);
}

@Override
public String getName() {
return “Service2”;
}
}
步骤 3

为 JNDI 查询创建 InitialContext。

public class InitialContext {
public Object lookup(String jndiName){
if(jndiName.equalsIgnoreCase(“SERVICE1”)){
System.out.println(“Looking up and creating a new Service1 object”);
return new Service1();
}else if (jndiName.equalsIgnoreCase(“SERVICE2”)){
System.out.println(“Looking up and creating a new Service2 object”);
return new Service2();
}
return null;
}
}
步骤 4

创建缓存 Cache。

import java.util.ArrayList;
import java.util.List;

public class Cache {

private List services;

public Cache(){
services = new ArrayList();
}

public Service getService(String serviceName){
for (Service service : services) {
if(service.getName().equalsIgnoreCase(serviceName)){
System.out.println(“Returning cached “+serviceName+” object”);
return service;
}
}
return null;
}

public void addService(Service newService){
boolean exists = false;
for (Service service : services) {
if(service.getName().equalsIgnoreCase(newService.getName())){
exists = true;
}
}
if(!exists){
services.add(newService);
}
}
}
步骤 5

创建服务定位器。

public class ServiceLocator {
private static Cache cache;

static {
cache = new Cache();
}

public static Service getService(String jndiName){

  Service service = cache.getService(jndiName);

  if(service != null){
     return service;
  }

  InitialContext context = new InitialContext();
  Service service1 = (Service)context.lookup(jndiName);
  cache.addService(service1);
  return service1;

}
}
步骤 6

使用 ServiceLocator 来演示服务定位器设计模式。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

public class ServiceLocatorPatternDemo {
public static void main(String[] args) {
Service service = ServiceLocator.getService(“Service1”);
service.execute();
service = ServiceLocator.getService(“Service2”);
service.execute();
service = ServiceLocator.getService(“Service1”);
service.execute();
service = ServiceLocator.getService(“Service2”);
service.execute();
}
}
步骤 7

执行程序,输出结果:

Looking up and creating a new Service1 object
Executing Service1
Looking up and creating a new Service2 object
Executing Service2
Returning cached Service1 object
Executing Service1
Returning cached Service2 object
Executing Service2

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值