Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 在带有闭包/委托/函数指针的编程语言中是否使用模板方法模式?_Design Patterns_Functional Programming_Function_Delegates_Closures - Fatal编程技术网

Design patterns 在带有闭包/委托/函数指针的编程语言中是否使用模板方法模式?

Design patterns 在带有闭包/委托/函数指针的编程语言中是否使用模板方法模式?,design-patterns,functional-programming,function,delegates,closures,Design Patterns,Functional Programming,Function,Delegates,Closures,在过去的8年里,我一直在C#和Java之间来回奔波 令我震惊的是,我已经完全停止使用C#中的“模板方法”设计模式。事实上,在C#中,我认为这种模式是一种反模式 回到Java,我发现这个模式是活跃的。我仍然认为它看起来很古老,但我意识到在java中没有其他方法可以做到这一点。Java看起来也很古老;) 既然这会出现,为什么它是一个反模式 很多时候,它会因为“错误的原因”而耗尽您的继承层次结构 基类有被各种不相关的代码所充斥的趋势 它迫使您锁定设计,通常是在开发过程的早期。(在许多情况下过早锁定

在过去的8年里,我一直在C#和Java之间来回奔波

令我震惊的是,我已经完全停止使用C#中的“模板方法”设计模式。事实上,在C#中,我认为这种模式是一种反模式

回到Java,我发现这个模式是活跃的。我仍然认为它看起来很古老,但我意识到在java中没有其他方法可以做到这一点。Java看起来也很古老;)

既然这会出现,为什么它是一个反模式

  • 很多时候,它会因为“错误的原因”而耗尽您的继承层次结构
  • 基类有被各种不相关的代码所充斥的趋势
  • 它迫使您锁定设计,通常是在开发过程的早期。(在许多情况下过早锁定)
  • 在以后的阶段改变这一点变得越来越困难
因此,对于闭包/委托/函数指针,通常传递一些函数,而不是子类化

回到问题上来:


如果您的语言有闭包/委托/函数,您是否使用模板方法,何时使用?

当我使用Java时,是的。但是对于带有“closures/delegate/function”的语言,Lua在我的例子中,不,我不再是了,相反,我越来越倾向于满足我的大部分需求。

是的,我一直在使用模板方法,在D编程语言中。闭包、委托和函数指针本质上与基类的耦合非常松散。当您需要这种松耦合时,这是一件好事。另一方面,有时您定制的行为本质上与基类紧密耦合。这种行为在任何其他情况下都是无用的。在需要这种耦合的情况下,模板方法模式是最干净、最简单的表达方式


一个简单的测试是,如果基类和可定制行为之间的通信是单向的,即基类调用可定制行为,那么您应该始终使用策略/闭包/委托/函数指针。如果可自定义的行为需要对基类的引用,以便调用方法等,那么模板方法模式通常是最简单的继续方式。

我将在重新访问此线程时再添加一个答案:


当您自定义基本对象的策略需要相互了解时,模板方法模式优于策略模式,并且只能在所有可能组合的非常有限的子集中使用。例如,假设您的基类有一个具体的函数
doIt()
,钩子
beforeDoIt()
,设计用于允许策略自身初始化,钩子
afterDoIt()
,设计用于允许策略自后清理。您不希望单独设置这些行为,因为它们只有在配对时才有意义。

阅读您的答案很有趣。你能举个例子说明模板方法模式“绝对”是最好的,特别是在耦合性好的地方吗??只是假设耦合总是不好的@拉古:关键不在于耦合是好是坏。关键是它是必要的还是不必要的。如果有必要的话,我想最简单的表达方式是模板法。我理解你回答手头问题的意思。我的问题是一般性的。对我来说,模板模式中的耦合是一个糟糕的副作用。有耦合良好的例子吗?@ragu:你没抓住重点。我的意思是,如果策略将与基类紧密耦合,并且需要了解很多关于它的知识,那么模板方法模式使其易于表达。耦合从来都不是好的,但有时是必要的。我只是说,如果您使用策略或委托,或者在策略必须非常了解基类并且不能在其他上下文中重用(与基类紧密耦合)的情况下使用,你真的没有解耦任何东西,但你已经使你的代码更冗长,可读性更低。我喜欢你关于模板方法模式的观点,关于不可避免的耦合。谢谢你的澄清。