消灭成堆的分支语句之类责任链模式
摘要
分支语句是所有编程语言的基本元素,比如Java语言中的if else和switch语句,它们提供一种能力允许程序根据一些条件动态地选择执行某些代码块。这种动态性给程序带来了很多的灵活性!
正因为if else如此方便如此灵活,很多代码中它都会被滥用,就像下面这样让人崩溃的、嵌套的、成堆的分支语句:
import java.util.ServiceLoader;import java.util.Iterator;public class Manager { private static Arraylist; static { list = new Array(); ServiceLoaderloader = ServiceLoader.load(Handler.class); Iteratorit = loader.iterator(); while (it.hasNext()) { list.add(it.next()); } } public static void process(Properties options) { for (Handler handler : list) { if (handler.accept(options)) { handler.execute(); } } }}上面代码使用了服务加载功能自动实例化所有注册过的Handler子类,如果你还不了解它的原理,可查看相应的API文档。有了这些代码,已经万事具备!也许你已经发现,这样的设计和JDBC的接口不谋而合:Manager对应java.sql.DriverManager、Handler对应java.sql.Driver、RequestHandler这些类则对应数据库厂商自己实现的驱动程序。
基于这样的框架,它的代码总量也许比原来的要多,但你不再需要在一堆if else中仔细推敲代码执行的前提条件,所有的前提条件都在accept函数里;添加新的功能所要做的仅需实现一个新的类,无须修改现有代码,符合开闭原则。
总结本文中介绍了两种方法在我的实际开发中运用很多。比如昨天分享的“微信版开窗游戏”就是用“类责任链模式”结合“状态模式”实现的(不过它不是用Java写的)。如果你有其他方法来处理上述问题,欢迎留言交流。感想你耐心地读完全文!
PS:其实消灭分支语句的方法还有很多,也许可以继续写一个系列~嘿嘿。