最新
推荐
2014年高等教育信息化十大“关... 01-04 教育部成立教育信息化专家组 12-24
CERNET第二十一届学术年会 11-24 李志民:互联网促进人类文明迈... 11-15
| 3.2 使用桥接模式动态设定客户端连接方式
桥接(Bridge)模式的描述如下:“将抽象部分与它的实现部分分离,使它们都可以独立的变化”[4]。其UML类图及其说明如图 4所示。[5] [6]
图 4 桥接模式UML图
图 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扩展连接 (1) 分离Connector和ConnectorImp 将Connector和ConnectorImp分离有助于降低对具体扩展部分编译时刻的依赖性,当改变一个扩展类时,并不需要重新编译Connector类和它的客户程序。 (2) 提高可扩充性 Connector和ConnectorImp层次结构都可以通过生成子类的方法分别进行独立的扩充,并且可以对不同的基本连接部分和扩展连接部分进行动态组合,便于实现多样化。 (3) 实现细节对客户透明 客户仅知道Connector和ConnectorImp即可。 3.3 用命令模式将请求细节与客户端代码解耦合 |
版权所有:中国教育和科研计算机网网络中心 CERNIC,CERNET,京ICP备15006448号-16,京网文[2017]10376-1180号
关于假冒中国教育网的声明 | 有任何问题与建议请联络:Webmaster@staff.cernet.com