中国教育和科研计算机网
EDU首页 |  中国教育 |   高校科技 |   教育信息化 |   CERNET
教育信息化

资讯 | 专题 会议 观点 专栏 访谈 企业 产品 CIO 技术 校园信息化 下一代互联网 IPv6视频课堂

中国教育网 > 教育信息化
您现在的位置: EDU首页 > 教育信息化 > 集成应用 > 科研应用 > 其  它
设计模式在JNDI进一步简化访问过程中的应用
http://www.edu.cn   2008-05-25 中国教育和科研计算机网 作者:石磊;柳伟

字体选择:【大】 【中】 【小】

  3.2 使用桥接模式动态设定客户端连接方式

  桥接(Bridge)模式的描述如下:“将抽象部分与它的实现部分分离,使它们都可以独立的变化”[4]。其UML类图及其说明如图 4所示。[5] [6]

图 4   桥接模式UML图


  利用JNDI,客户端可以选择多种方式同目录服务器建立连接,作者所分析的目录服务器客户端程序包括匿名连接、基本认证连接、SSL匿名连接以及SSL认证连接四种方式,其中后两种为匿名连接和基本认证连接分别与SSL连接组合而成的连接。不同的连接方式是通过设置不同的环境变量来实现的。因此,如果程序执行时需要动态改变连接方式,则必须重复调用哈希表env的put方法。显然,这样的编码方案对客户端来讲不具有透明性,当进行新连接时,只能直接修改现有连接方式的属性值。另外,简单采用继承机制协调多种连接方式不够灵活,因为继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。假设有一个抽象的Connector类,它有两个子类AnonymousConnector和AuthorizationConnector分别对应于匿名连接和基本认证连接。现在,由于应用需求增加了SSL连接并且也作为Connector的子类,那么,为了实现SSL匿名连接和SSL认证连接,必须定义两个新类SSLAnonymousConnector和SSLAuthorizationConnector,如图5所示。更为糟糕的是,每增加一类连接,系统都要为该类型增加定义两个类,增加了系统的复杂度。

图 5  采用纯继承机制的连接模块UML图

  桥接模式可以很好地解决这个问题,将基本连接和扩展连接分别放在独立的类层次结构中。其中一个类层次结构针对基本连接类型(匿名连接和基本认证连接),其根类为Connector,抽象了所有连接的共有行为;另外一个独立的类层次结构针对在基本连接之上的扩展连接类型(比如SSL连接),其根类为ConnectorImp。对Connector类所有连接设置的扩展操作都是通过调用ConnectorImp接口中的抽象操作实现的,这就将基本连接类型同扩展连接类型分离开来。其UML类图及说明如图6所示。

图 6  目录服务器连接模块UML图

  在图6中,Connector类是一个抽象类,维护一个指向ConnectorImp类型对象的指针。setUp()方法用于设置连接的环境变量,connect()方法依照setUp()方法指定的连接方式同目录服务器建立连接,并且返回DirContext类型的引用,setConnectorImp()方法使用一个单态类ConnectorImpSingleton来选择所用的扩展连接方式,该单态类充当代理的角色。getConnectorImp()方法返回实际的ConnectorImp对象。ConnectorImp类为具体的扩展连接类定义了环境变量设置接口extendSetUp(),SSLConnector类实现了这个接口。AnonymousConnector类和AuthorizationConnector类分别按照自己的连接方式实现了Connector类的setUp()方法,并在该方法中利用ConnectorImp对象调用extendSetUp()。

  进行桥接后,可以将基本连接类型和扩展连接类型这两个相对独立类层次中的实体进行动态的组合。以SSL认证连接为例,AuthorizationConnector类的setUp()方法首先要用name和psw的值设置环境变量env,然后获得imp并调用imp的extendSetUp()方法。imp的类型由单态类ConnectorImpSingleton设定,这里被指定为SSLConnector。setUp()方法的调用过程如图7所示。通过图7可以看出,在调用extendSetUp()方法之后,客户端到服务器的连接由基本认证方式变为SSL认证方式。使用JNDI连接目录服务器的客户端代码如图7所示:

 

图7  SSL认证连接方式下,setUp()方法调用过程图

 

  //设置使用SSL扩展连接
  ConnectorImpSingleton connectSingleton =  new ConnectorImpSingleton(
  new SSLConnector());
  //创建连接对象
  AuthorizationConnector
  SSLAuthorizationConnector =
  new  AuthorizationConnector(name, psw);
  //组合基本认证连接和SSL连接
  SSLAuthorizationConnector.setUp();
  //连接到服务器
  DirContext ctx =
  SSLAuthorizationConnector.connect();
  上面的代码抽象了JNDI同目录服务器的连接过程。可以看到,在基本连接类型和扩展连接类型之间进行桥接,使得客户端程序可以根据需要在运行时动态的设置同服务器的连接方式,这种设计方案增加了代码的扩展性和可重用性。我们可以从以上的分析中总结出使用桥接模式的好处:

  (1) 分离Connector和ConnectorImp

  将Connector和ConnectorImp分离有助于降低对具体扩展部分编译时刻的依赖性,当改变一个扩展类时,并不需要重新编译Connector类和它的客户程序。

  (2) 提高可扩充性

  Connector和ConnectorImp层次结构都可以通过生成子类的方法分别进行独立的扩充,并且可以对不同的基本连接部分和扩展连接部分进行动态组合,便于实现多样化。

  (3) 实现细节对客户透明

  客户仅知道Connector和ConnectorImp即可。

  3.3 用命令模式将请求细节与客户端代码解耦合

页面功能 【打印】 【关闭】 【我有话说

MOOC风暴来袭

版权所有:中国教育和科研计算机网网络中心 CERNIC,CERNET,京ICP备15006448号-16,京网文[2017]10376-1180号

关于假冒中国教育网的声明 | 有任何问题与建议请联络:Webmaster@staff.cernet.com