- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我越来越多地看到相同解决方案的新标签,但名称不同。在这种情况下,为什么我们不能简单地说 Execute Aroud 习语与 Strategy design pattern 相同?
当我阅读 Jon Skeet’s answer对于这个问题:“什么是‘Execute Around’成语?”,他说:
it's the pattern where you write a method to do things which are always required, e.g. resource allocation and clean-up, and make the caller pass in "what we want to do with the resource".
在这种情况下,@jon-skeet 使用 executeWithFile(String filename, InputStreamAction action)
方法作为该方法的示例,该方法执行始终需要的操作,并且接口(interface) InputStreamAction
作为我们想对资源做什么的抽象。
public interface InputStreamAction
{
void useStream(InputStream stream) throws IOException;
}
将此与 Stratey design pattern 进行比较为什么我们不能只说 InputStreamAction
接口(interface)定义了一系列算法?并且,InputStreamAction
接口(interface)的每个实现都对应于封装算法的具体策略。最后,这些算法是可以互换的,我们可以将 executeWithFile
与任何这些策略一起使用。
那么,为什么我不能解释 Jon Skeet’s answer作为 Stratey design pattern 的应用示例?
顺便问一下,哪个成语先出现? Execute Around 还是 Strategy 设计模式?
虽然 Execute Around 惯用语通常与函数式编程有关,但我找到的关于它的唯一文档是在 Smalltalk Best Practice Patterns 中。 1997 年出版的 Smalltalk 编程语言范围内的书籍,它遵循 OO 方法。
因为设计模式描述了针对反复出现的问题的一般解决方案,所以我们可以说 Execute Around 和 Strategy 都是相同的解决方案解决不同的问题。所以,我问:我们真的需要一个不同的名称来标识相同的解决方案,当它应用于不同的问题时吗?
尽管我同意@iluwatar 的answer这是交流不同想法的方式,我仍然认为我可以传达 Execute Around 的想法,只是告诉它:“我使用策略来指定我想对资源做什么,它始终以相同的方式设置和清洁。”
所以 Execute Around 习语减少了歧义(这很好),但同时增加了设计模式的名称?而且,这是一个好习惯吗?
最佳答案
在我看来,虽然两者可能是解决类似问题的方法,但它们是不同的成语,因此应该有不同的名称。
我称它们为成语,因为围绕它执行的只是一个 programming idiom ,用于许多典型情况(类似于所介绍的情况),也用于多种语言。而且,至少据我所知,Execute Around 从未正式成为一种软件设计模式,至少现在是这样。
为什么它们不同?这是我的观点:
Stategy设计模式旨在(来自维基百科):
- defines a family of algorithms,
- encapsulates each algorithm, and
- makes the algorithms interchangeable within that family.
通常,策略 实例作为与上下文实例的长期关系,通常作为构造函数依赖项传递。即使上下文可能有策略的 setter ,相同的策略可以在对上下文的多次调用中使用,而调用者(客户端)甚至不知道该特定上下文正在使用哪个策略,并且此刻通话已完成。此外,相同的策略实例可能会在其公共(public)接口(interface)的多个方法中被上下文使用,而调用者甚至不知道其用法。
另一方面,execute around 习语 适用于参数化算法,其中调用者(客户端)应始终在每次调用中传递算法参数化函数。因此,传递的策略 函数只会影响该特定调用的行为,不会影响其他调用。
尽管所呈现的差异可能在理论上和修辞上存在缝合,但如果您将被调用的上下文置于多线程场景中,我认为差异会更加明显并且更容易被看到和“感觉到”。
如果没有大量的锁和同步,就不能在多线程场景中使用策略设计模式,至少在允许更改上下文策略的情况下是这样。如果不这样做,您会看到上下文和策略之间的关系会持续更长时间,因为它们通常存在于同一时间。
execute around 成语如果实现得当,应该不会患上这种“疾病”,至少如果传递的函数没有任何副作用的话。
总结一下,虽然Strategy 设计模式和execute around 习语可能接缝相似,可能用于解决类似的问题,并且可能接缝具有类似的静态结构,它们本质上是不同的,前者更面向对象风格,后者更实用,因此,它们应该有不同的名称!
我同意 Miguel Gamboa 的观点,大量使用具有相同含义的名称并不好,应该避免。但是,至少在我看来,情况并非如此。
希望这对您有所帮助!
关于java - 为什么 Execute Aroud 习语不被视为策略设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29166024/
这个问题已经有答案了: What is the Java ?: operator called and what does it do? (17 个回答) 已关闭 8 年前。 ltVal = node
我是一名 Java 学生,我在嵌套该程序的条件语句时遇到问题 Exercise CozaLozaWoza (Loop & Condition): Write a program called Coza
首先,我想给出用户想要留下的句子的数量,当他的写作结束时,我的代码开始将每个单词的第一个字母大写(在 Java 中)。 import java.util.Scanner; public class I
我尝试在基类中实现一个函数,该函数使用子函数(defiend 作为基类中的抽象函数)。我认为一个例子可以最好地说明这个问题。 abstract class Animal{ public void
就像在口吃中一样,如果文本为“dean”并且乘数为 3,则结果将是“dddeeeaaannn”。 public static void repeatLetters() { String text
public void insert(int data) { if (root == null) root = new AVLNode(data); else {
我是 XPATH 的新手,并且遇到以下问题: 我有以下代码片段,但似乎无法按我的预期工作: String XML = cdataContent;
例如,Java 数据类型字节将数据从 -128 到 127 存储在单个字节中。为了能够区分 - 1 到 -128 从 0 到 127 将需要额外的数据,这些数据将采用数据类型覆盖其分配的存储空间。不可
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
Dataset: P1: Lion, Snow, Chair P2: Min: 0, Max: 28 P3: Min: 34, Max is 39. 我的程序 以一系列数组列表的形式提供上述数据集(P
我正在构建一个应该 24/7 全天候运行的客户端服务器应用程序。应用程序指定检测网络故障(使用心跳)并尽快重新连接到服务器。 我做的第一个测试只是停止客户端或服务器,然后重新启动,一切正常。我想知道是
我怀疑它是编写它的类的类型,但我不是 100% 确定,有人可以证实我的怀疑并可能提供对定义此行为的 Java 语言规范的引用吗? 假设类 A 有一个方法 a(),它在其主体中使用了 this 关键字,
我已经在谷歌上搜索了两个小时,但没有成功。 如果我有一个模板函数并且我想在模板类型上强制执行一个接口(interface),我该怎么做? 例如。 void doStuff(T)(bool param)
我正在尝试获取用户输入并对其进行修改,以便打印不带任何元音的字符串。我已经能够使用以下代码成功完成此操作。 Scanner in = new Scanner(System.in); Syste
每当我使用 Thread.sleep(); 时在 do while 循环中,提示告诉我,“在循环中调用 Thread.sleep 可能会导致性能问题。”我从许多其他网站和书籍上听到过这一点。我可以用什
请不要将其视为以下内容的重复项而将其忽略: How to generate random positive and negative numbers in java 我需要使用带有种子的随机数生成器。
我想在一个数字范围内选择随机数,但权重偏向该范围的一部分。例如: 选择1-10之间的随机数 对其进行加权,使 1-5 比 6-10 的可能性高 20% 这可能吗?我该怎么做? 最佳答案 这取决于您希望
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我有一个付款 Activity 和启动 Activity ,它在用户购买后显示内容应用程序。付款 Activity 是Manifest.xml中的默认启动器,我想将启动器 Activity 设置为启动
我有一个指针和长度。如何从他们那里得到一个动态数组? 最佳答案 设ptr是一个指针,len是一个长度,那么很容易如下: ptr[0..len] 请注意,这不会复制数组,而是就地使用数据。 如果要复制数
我是一名优秀的程序员,十分优秀!