场景
假如要写一个文件解析器。针对不同的文件类型调用不同的方法。如果用一个函数来表达,可能会写出如下代码:
1 | function fileParser(fileType) { |
每增加一种类型,我们需要修改我们的 fileParser 函数,增加一个条件判断。这样不够优雅。
实现
nodejs 的 require 函数也会遇到上面的情况,它需要针对三种不同的类型 —— js、json、node 分别做处理。我们来看看它是如何实现的:
1 | // Native extension for .js |
这些函数在 Module.prototype.load
过程中调用。
1 | Module.prototype.load = function(filename) { |
我们看到这个过程没有了条件判断的流程。而且对多类型支持也非常方便,只需要扩展类型方法即可,不需要修改所谓的 fileParser 方法(符合 open / close 原则)。
策略模式便是在运行时选择算法,并且消除了判断流程的一种模式。
参考
ISSUE
有问题?来 Github 一起讨论。