>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 26363 个阅读者 刷新本主题
 * 贴子主题:  Java设计模式:服务定位器模式 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2019-08-18 17:41:05     消息  查看  搜索  好友  邮件  复制  引用

  

服务定位器模式

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

    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

步骤 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








程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-02-14 09:26:00 重新编辑]
  Java面向对象编程-->类的生命周期
  JavaWeb开发-->JSP技术详解(Ⅰ)
  JSP与Hibernate开发-->映射对象标识符
  Java网络编程-->Java网络编程入门
  精通Spring-->
  Vue3开发-->计算属性和数据监听
  BIO、NIO和AIO的区别、三种IO的原理与用法
  Java设计模式:接口隔离原则和迪米特法则详解
  十分钟带你搞懂 Java AQS 核心设计与实现!
  使用策略模式优化代码实践,如何让项目快速起飞
  java 中文繁简体转换工具 opencc4j
  Java方法的嵌套与递归调用
  NoClassDefFoundError和ClassNotFoundException的区别
  java常见的几种调用机制:同步调用,异步调用,回调
  Eclipse使用指南:创建Java项目的步骤
  常用的正则表达式汇总
  Java入门实用代码:List 循环移动元素
  Java入门实用代码:集合输出
  Java入门实用代码:100以内整数求和运算
  判断一个字符是否是汉字
  java零基础入门-面向对象篇 抽象类
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。