闭包、参数行为化、策略模式,是一回事吗?

贴个看起来相关的Java代码:

    public static <K, V> List<K> transformToList(Collection<V> from, Function<K, V> func) {
        List<K> ret = new ArrayList<K>();
        for (V v : from) {
            K k = func.call(v);
            if (k == null) {
                continue;
            }
            ret.add(k);
        }

        return ret;
    }

想问的是闭包、参数行为化、策略模式,是一回事吗?隐隐约约觉得有很多共性,但不是完全相同。

阅读 2.9k
3 个回答

不完全是吧,闭包、参数行为化是语言特性(几乎是一回事),策略模式是设计模式,是个略为宽泛的概念。但这段代码的确可以说涉及了这三个概念。

策略模式   -> 计划,想要达到的效果
参数行为化 -> 操作,具体的实践操作
闭包       -> 原理,背后支撑的原理

(个人理解,有误请指出)
策略模式是设计模式的一种,将算法和行为进行抽象,将变化的部分独立出去。
行为参数化将策略模式需要提供的接口泛化,提供一个更加普适的接口,更在语法层面进行支持(虽然出现的有点晚)。
所以说策略模式和行为参数化其目的是一致的,但是策略模式更像是一种指导思想,而行为参数化是对策略模式的一种实践。
而闭包的话,从实现的目标上和形式来说,跟策略模式/行为参数化并不是一回事。闭包,我的理解是,一个函数能够访问另一个函数作用域内的变量。闭包带来的影响是,保持对外部函数作用内的变量的引用。它的目的是将这个闭包函数暴露出来,而隐藏外部函数的细节。
因此,策略模式的中策略接口的方法,如Function.call(T t),会将外部变量t以参数的形式传递进去,这是t是作为一个内部变量存在的,这违背了闭包的特征。
有误请指正。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题