设计模式学习笔记--服务定位器模式

三十二、服务定位器模式

服务定位器模式(Service Locator Pattern),主要用在JDNI中,充分利用缓存来快速定位使用服务service,来提高效率。

实现

创建service接口,以及接口的实现类,也就是具体的service,然后创建服务定位器,和缓存对象类。在创建一个初始化条件类。

service

  • Service接口

    IService.java

    package patterns.service;
    
    /**
    * Created by lenovo on 2016/12/12 0012.
    * 服务接口
    */
    public interface IService {
      public String getName();
      public void execute();
    }
  • 接口实现类

    Service1.java

    package patterns.service;
    
    /**
    * Created by lenovo on 2016/12/12 0012.
    * Service 接口实现类
    */
    public class Service1 implements IService {
      @Override
      public String getName() {
          return "Service1";
      }
    
      @Override
      public void execute() {
    System.out.println("执行服务,1#服务");
      }
    }

    Service2.java

    package patterns.service;
    
    /**
    * Created by lenovo on 2016/12/12 0012.
    * Service 接口实现类
    */
    public class Service2 implements IService {
      @Override
      public String getName() {
          return "Service2";
      }
    
      @Override
      public void execute() {
    System.out.println("执行服务,2#服务");
      }
    }
  • 目标程序类

    Target.java

    package patterns.intercepting;
    
    /**
    * Created by lenovo on 2016/12/12 0012.
    * 目标程序类
    */
    public class Target {
      public void execute(String request){
          System.out.println("执行处理请求 "+request);
      }
    }
  • 缓存类

    Cache.java

    package patterns.service;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
    * Created by lenovo on 2016/12/12 0012.
    * 缓存类
    */
    public class Cache {
      private List<IService> services;
    
      public Cache() {
          services = new ArrayList<>();
      }
    
      public List<IService> getServices() {
          return services;
      }
    
      public void addServices(IService service) {
          boolean exists = false;
          for (IService s : services) {
              if (s.getName().equalsIgnoreCase(service.getName())) {
                  exists = true;
              }
          }
          if (!exists) {
              services.add(service);
          }
      }
    
      public IService getService(String serviceName) {
          for (IService s : services) {
              if (s.getName().equalsIgnoreCase(serviceName)) {
                  return s;
              }
          }
          return null;
      }
    }
  • 初始化类

    InitialContext.java

    package patterns.service;
    
    /**
    * Created by lenovo on 2016/12/12 0012.
    * 针对JNDI而创建的初始化类
    */
    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 Service1 object");
              return new Service2();
          }
          return null;
      }
    }
    
  • 定位器端

    ServiceLocator.java

    package patterns.service;
    
    /**
    * Created by lenovo on 2016/12/12 0012.
    * 服务定位器
    */
    public class ServiceLocator {
      private static Cache cache;
    
      static {
          cache = new Cache();
      }
    
      public static IService getService(String jndiName) {
          IService service = cache.getService(jndiName);
          if (service != null) {
              return service;
          }
          InitialContext context = new InitialContext();
          IService service1 = (IService) context.lookup(jndiName);
          cache.addServices(service1);
          return service1;
      }
    }
  • 演示

    InterceptingFilterPatternDemo.java

    package patterns.service;
    
    /**
    * Created by lenovo on 2016/12/12 0012.
    * 演示
    */
    public class ServiceLocatorPatternDemo {
      public static void main(String[] args){
          //service都是新建
          IService service = ServiceLocator.getService("service1");
          service.execute();
    
          service = ServiceLocator.getService("service2");
          service.execute();
    
          //service开始使用缓存
          service = ServiceLocator.getService("service1");
          service.execute();
          service = ServiceLocator.getService("service2");
          service.execute();
      }
    }

  • 输出

    Looking up and creating a new Service1 object
    执行服务,1#服务
    Looking up and creating a new Service1 object
    执行服务,2#服务
    执行服务,1#服务
    执行服务,2#服务
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值