网站设计模式 专题
您的位置:web > 网站设计模式专题 > 服务定位器模式
服务定位器模式
作者:--    发布时间:2019-11-20

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

  • 服务(service) - 实际处理请求的服务。对这种服务的引用可以在 jndi 服务器中查找到。
  • context / 初始的 context - jndi context 带有对要查找的服务的引用。
  • 服务定位器(service locator) - 服务定位器是通过 jndi 查找和缓存服务来获取服务的单点接触。
  • 缓存(cache) - 缓存存储服务的引用,以便复用它们。
  • 客户端(client) - client 是通过 servicelocator 调用服务的对象。

实现

我们将创建 servicelocatorinitialcontextcacheservice 作为表示实体的各种对象。service1service2 表示实体服务。

servicelocatorpatterndemo,我们的演示类在这里是作为一个客户端,将使用 servicelocator 来演示服务定位器设计模式。

服务定位器模式的 uml 图

步骤 1

创建服务接口 service。

service.java

public interface service {
   public string getname();
   public void execute();
}

步骤 2

创建实体服务。

service1.java

public class service1 implements service {
   public void execute(){
      system.out.println("executing service1");
   }

   @override
   public string getname() {
      return "service1";
   }
}

service2.java

public class service2 implements service {
   public void execute(){
      system.out.println("executing service2");
   }

   @override
   public string getname() {
      return "service2";
   }
}

步骤 3

为 jndi 查询创建 initialcontext。

initialcontext.java

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。

cache.java

import java.util.arraylist;
import java.util.list;

public class cache {

   private list<service> services;

   public cache(){
      services = new arraylist<service>();
   }

   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

创建服务定位器。

servicelocator.java

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 来演示服务定位器设计模式。

servicelocatorpatterndemo.java

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
网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册