问题标签 [template-method-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
126 浏览

oop - 我应该为开源库使用事件还是“模板方法”模式?

我正在构建一个开源库,我可以总结如下:

我想为库的用户提供添加自定义行为的可能性。

例如,他可能想在操作中的特定点插入一些日志记录,或者他可能想在某个点修改对象。

我看到了两种方法:

  • 模板方法模式似乎很合适,但它会迫使我添加很多受保护的方法(比如beforeDoingThingA()afterDoingThingA()...),它会迫使库的用户扩展我的类以添加他的行为。

  • 使用事件:SuperThing::doStuff()引发事件,用户可以注册到任何他想要的。

对我来说,使用事件似乎更简单、更清晰、更易于维护......

但在我看来,事件主要是关于发送发生某事的消息。不允许有人“钩”入操作并修改某些对象。也许我错了。

那么事件是否适合这种情况?如果没有,是否有模板方法模式的替代方案?

0 投票
3 回答
145 浏览

ios - 在init中操作由Objective-C中的子类设置的属性

我在 Objective-C 中有一个抽象接口,其中每个子类都需要设置一个属性,然后在init. 我试图避免使用类似这样的重复代码:

接口文件

实施文件

我的问题是每个子类都需要传递一组不同的参数initProperty才能正确实现该方法:

有没有一种干净的方法来做我想要在 Objective-C 中做的事情?到目前为止,我的选择似乎是:

  1. 创建一个“财产包”,然后传递一个NSDictionary.
  2. 复制[property doSomething];每个子类中的代码。
  3. 以某种方式将工厂对象传递给 init,并让工厂对象创建prop。这种方法似乎最干净,但我需要工厂对象以某种方式将矩形和/或半径保持为内部状态,这对我来说似乎并不干净。

有什么想法吗?

0 投票
3 回答
375 浏览

oop - 我将策略设计模式与模板方法设计模式结合使用的示例是否有意义?

对于一些作业,我们必须设计一个示例(带有类),其中策略和模板方法设计模式结合在一起,相互补充,从而使它们更加可定制。或者如它所说的“使用模板方法提供更多的可定制性来处理各种策略”。

经过大量阅读和最初的困惑,我想出了将两种动物作为类的想法,DogSnake让它们都使用接口来实现特定的功能,移动(所以狗可能会走路而蛇会滑行)。我认为这是策略模式部分,因为他们每个人都分别实现自己的移动功能。

为了将模板方法模式纳入其中,我想我会这样做,以便将它实现的类进一步子类化以实现可定制性,这似乎与问题相符。所以我想我会Mover作为班级并将其细分为Walkand Slither。但这让我感到困惑,因为每只动物都会实现超类Mover还是子类之一?超类是抽象的,而子类是接口吗?还是它们都是接口?

我的例子有意义吗?

0 投票
2 回答
147 浏览

c++ - 模板方法模式混乱

在这里,钩子函数本身需要检查也属于类层次结构的数据成员的 typeid。因此,我为该类层次结构定义了一个模板方法。这是我遇到的混乱:

}

所以对于这种情况,我不得不求助于我的原始方法,即为每种类型的 Person 派生类使用 typeid(*person) 和 dynamic_cast 和 if 语句来定义虚拟 locationHook,对吗?

0 投票
1 回答
113 浏览

c# - 重构类设计以传达设计意图

我有以下课程设计。完整代码可在“如何使用泛型实现此功能? ”中找到。该代码工作正常,并解决了“重构代码以避免类型转换”中提到的转换问题

RetailInvestmentReturnCalculator类中,该GetInvestmentProfit()方法利用抽象基类CalculateBaseProfit()中存在的方法。InvestmentReturnCalculator这一事实在类设计中并不明显。

问题

  1. 如何重构此类设计以传达上述事实?
  2. 防止此类设计错误的设计指南是什么?

注:Martin Fowler:设计死了吗?

我们所说的软件架构是什么意思?对我来说,架构这个术语传达了系统核心元素的概念,即难以改变的部分。其余部分必须建立的基础

类图

在此处输入图像描述

抽象的

具体的

0 投票
1 回答
197 浏览

javascript - JavaScript 中带有 setTimeout 的模板方法模式

我有一个close可以关闭某些实例的功能。包含该函数的类允许派生类覆盖close。在这里,我想确保即使在派生类中也close总是调用。dispose我通过以下方式实现了这一点。

这很好用,但我有一种情况,我想在处置实例之前执行 CSS 动画。这就是我所做的。

但是一旦我这样做了,我使用的模板模式就无法应用了。有没有办法确保 close 函数在第二个示例中始终调用 dispose ?

0 投票
2 回答
178 浏览

asp.net-mvc - 提供对抽象类的依赖

我想知道是否有一些最佳实践来为抽象组件提供依赖关系。

假设我有这样的模板方法算法:

我还没有设法将myDependecy注入到类中,因为抽象的 TemplateMethod 当然永远不会被实例化。我已经设法为它提供服务位置,但我确信有更好的方法来做到这一点。

有任何想法吗?

PS 使用Castle Windsor作为 IoC 容器。

0 投票
2 回答
142 浏览

c++ - 在非虚拟接口习语中添加不变量

假设我使用 NVI idiom 具有以下层次结构:

如果在层次结构中的某个点我想在非虚拟基础方法中“添加”不变量,那么最好的方法是什么?

一种方法是在 SpecialBase 级别递归 NVI 习语:

但我不太喜欢这个想法,因为我不想为我添加到我的层次结构中的每个派生基添加方法(具有不同的名称)......

另一种方法是拥有以下(不是NVI):

在我看来,这不那么令人困惑,因为在任何时候,一个具体的类只需要实现虚拟方法,而派生的基类可以覆盖基(虚拟)方法,如果它也选择的话。

是否有另一种更清洁的方法来实现相同的目标?

编辑:

我正在寻找一种非常通用的设计模式,它可以让我拥有以下类型的层次结构:

每个Base类都可以(并且将覆盖 foo),而类A-F只需要重新实现foo_impl.

请注意,仅添加另一个可选的自定义虚拟函数(例如bar_impl)在这里没有帮助,因为它只允许一个额外的自定义层,我可能需要一个无限的数量。

0 投票
1 回答
492 浏览

php - 使用 PHPUnit 模拟对象测试模板方法设计模式实现

假设我有模板方法设计模式实现的代码。我想在我的模板方法中测试方法调用的顺序和计数。我尝试使用 PHPUnit 模拟。我的源代码如下所示:

结果我有这样的错误:

是否可以使用模拟对象在这种情况下计算方法调用?

0 投票
3 回答
1115 浏览

design-patterns - 了解模板方法模式

据我了解,模板方法只不过是调用子类中定义的虚拟或抽象方法的普通方法。我是对的,还是我错过了这种模式的其他重要内容?

如果我是对的,还有其他常见的方法来实现 Template 方法吗?