命令(Command)模式描述如下:“将一个请求封装为一个对象,从而可以在客户端将请求、队列以及日志参数化。同时可以支持Undo操作”[4]。其UML类图及说明如图8所示。[5] [6]

图 8 命令模式UML
在JNDI中通过DirContext对象执行各种请求命令时,客户端代码需要先设定请求的各种选项,然后通过DirContext对象执行相应的操作,这就使得客户端代码与每一种操作请求的实现细节紧密耦合。在图8的命令模式UML图中,请求被封装为一个Command对象,该Command对象绑定了一个包含一组操作的Receiver对象。这样,客户代码可通过调用Command对象的execute方法来调用Receiver对象的具体执行动作。从外部来看,别的对象不需要知道哪个Receiver的动作将被执行,只需要知道如果调用execute()方法,它们的请求将被执行。这种模式实现了请求细节与客户端代码之间的解耦合。将命令模式应用于目录服务器发送请求阶段的设计,其UML设计类图如图9所示:

图 9 目录服务器请求处理模块UML
在图9中,AddCommand、DeleteCommand、ModifyCommand和SearchCommand分别为添加、删除、修改以及搜索的命令类,它们都通过调用DirContext对象的方法来完成各自的具体操作。DirContext对象在这里充当Receiver对象的角色,它是在3.2节改进中Connector对象执行connect()方法的返回值。可以看出,图9所表明的设计方案将客户端代码与向目录服务器发送请求的细节进行了有效的解耦合,增加代码的扩展性和灵活性。
4 结束语
Christopher Alexander 在他的《The Timeless Way of Building》一书提出设计模式思想后,模式在各个领域得到了充分应用,软件设计人员也认识到模式作为一种共享设计经验的语言所具有的价值。在软件设计中,适度地利用设计模式,可有效地共享重要的体系结构权衡方法和设计决策,从而大大促进软件开发过程人与人之间的交流,将使设计更加优雅和坚固[6]。
本文正是从这个角度出发,使用两个设计模式对目录服务器的访问过程进行了优化。桥接模式的应用使得客户端代码可以动态组合连接目录服务器的方式,并且可以很好适应新连接方式的扩展;命令模式将客户端代码与具体的请求细节进行解耦合,使得客户端代码在不用知道请求操作细节的情况下,发送不同的请求操作。总之,将设计模式应用于目录服务器的访问过程有效提高设计人员的开发效率以及代码的灵活性。
参考文献:
[1] 刘晓韬.目录服务中LDAP的基本模型[EB/OL].
http://industry.ccidnet.com/art/35/20031028/68839_1.html,2003-10-28.
[2] Ayers D. JAVA服务器高级编程[M]. 曾国平等译. 北京:机械工业出版社. 2001
[3] Robert C.Martin. Agile Software Development: Principles, Patterns, and Practices[M].USA: Prentice Hall, 2002.
[4] Eric Freeman, Elisabeth Freeman, Bert Bates, et al. Head First Design Patterns[M].USA: O'Reilly, 2004.
[5] 阎宏. Java与模式[M]. 北京:电子工业出版社,2003.
[6] E.Gamma, R.Helm, R.Johnson, and J.Vlissides. Design Patterns – Elements of Reusable Object-Oriented Software[M]. USA: Addison-Wesley, 1995.