问题标签 [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.
oop - 我应该为开源库使用事件还是“模板方法”模式?
我正在构建一个开源库,我可以总结如下:
我想为库的用户提供添加自定义行为的可能性。
例如,他可能想在操作中的特定点插入一些日志记录,或者他可能想在某个点修改对象。
我看到了两种方法:
模板方法模式似乎很合适,但它会迫使我添加很多受保护的方法(比如
beforeDoingThingA()
,afterDoingThingA()
...),它会迫使库的用户扩展我的类以添加他的行为。使用事件:
SuperThing::doStuff()
引发事件,用户可以注册到任何他想要的。
对我来说,使用事件似乎更简单、更清晰、更易于维护......
但在我看来,事件主要是关于发送发生某事的消息。不允许有人“钩”入操作并修改某些对象。也许我错了。
那么事件是否适合这种情况?如果没有,是否有模板方法模式的替代方案?
ios - 在init中操作由Objective-C中的子类设置的属性
我在 Objective-C 中有一个抽象接口,其中每个子类都需要设置一个属性,然后在init
. 我试图避免使用类似这样的重复代码:
接口文件
实施文件
我的问题是每个子类都需要传递一组不同的参数initProperty
才能正确实现该方法:
有没有一种干净的方法来做我想要在 Objective-C 中做的事情?到目前为止,我的选择似乎是:
- 创建一个“财产包”,然后传递一个
NSDictionary
. - 复制
[property doSomething];
每个子类中的代码。 - 以某种方式将工厂对象传递给 init,并让工厂对象创建
prop
。这种方法似乎最干净,但我需要工厂对象以某种方式将矩形和/或半径保持为内部状态,这对我来说似乎并不干净。
有什么想法吗?
oop - 我将策略设计模式与模板方法设计模式结合使用的示例是否有意义?
对于一些作业,我们必须设计一个示例(带有类),其中策略和模板方法设计模式结合在一起,相互补充,从而使它们更加可定制。或者如它所说的“使用模板方法提供更多的可定制性来处理各种策略”。
经过大量阅读和最初的困惑,我想出了将两种动物作为类的想法,Dog
并Snake
让它们都使用接口来实现特定的功能,移动(所以狗可能会走路而蛇会滑行)。我认为这是策略模式部分,因为他们每个人都分别实现自己的移动功能。
为了将模板方法模式纳入其中,我想我会这样做,以便将它实现的类进一步子类化以实现可定制性,这似乎与问题相符。所以我想我会Mover
作为班级并将其细分为Walk
and Slither
。但这让我感到困惑,因为每只动物都会实现超类Mover
还是子类之一?超类是抽象的,而子类是接口吗?还是它们都是接口?
我的例子有意义吗?
c++ - 模板方法模式混乱
在这里,钩子函数本身需要检查也属于类层次结构的数据成员的 typeid。因此,我为该类层次结构定义了一个模板方法。这是我遇到的混乱:
}
所以对于这种情况,我不得不求助于我的原始方法,即为每种类型的 Person 派生类使用 typeid(*person) 和 dynamic_cast 和 if 语句来定义虚拟 locationHook,对吗?
c# - 重构类设计以传达设计意图
我有以下课程设计。完整代码可在“如何使用泛型实现此功能? ”中找到。该代码工作正常,并解决了“重构代码以避免类型转换”中提到的转换问题
在RetailInvestmentReturnCalculator
类中,该GetInvestmentProfit()
方法利用抽象基类CalculateBaseProfit()
中存在的方法。InvestmentReturnCalculator
这一事实在类设计中并不明显。
问题
- 如何重构此类设计以传达上述事实?
- 防止此类设计错误的设计指南是什么?
我们所说的软件架构是什么意思?对我来说,架构这个术语传达了系统核心元素的概念,即难以改变的部分。其余部分必须建立的基础
类图
抽象的
具体的
javascript - JavaScript 中带有 setTimeout 的模板方法模式
我有一个close
可以关闭某些实例的功能。包含该函数的类允许派生类覆盖close
。在这里,我想确保即使在派生类中也close
总是调用。dispose
我通过以下方式实现了这一点。
这很好用,但我有一种情况,我想在处置实例之前执行 CSS 动画。这就是我所做的。
但是一旦我这样做了,我使用的模板模式就无法应用了。有没有办法确保 close 函数在第二个示例中始终调用 dispose ?
asp.net-mvc - 提供对抽象类的依赖
我想知道是否有一些最佳实践来为抽象组件提供依赖关系。
假设我有这样的模板方法算法:
我还没有设法将myDependecy注入到类中,因为抽象的 TemplateMethod 当然永远不会被实例化。我已经设法为它提供服务位置,但我确信有更好的方法来做到这一点。
有任何想法吗?
PS 使用Castle Windsor作为 IoC 容器。
c++ - 在非虚拟接口习语中添加不变量
假设我使用 NVI idiom 具有以下层次结构:
如果在层次结构中的某个点我想在非虚拟基础方法中“添加”不变量,那么最好的方法是什么?
一种方法是在 SpecialBase 级别递归 NVI 习语:
但我不太喜欢这个想法,因为我不想为我添加到我的层次结构中的每个派生基添加方法(具有不同的名称)......
另一种方法是拥有以下(不是NVI):
在我看来,这不那么令人困惑,因为在任何时候,一个具体的类只需要实现虚拟方法,而派生的基类可以覆盖基(虚拟)方法,如果它也选择的话。
是否有另一种更清洁的方法来实现相同的目标?
编辑:
我正在寻找一种非常通用的设计模式,它可以让我拥有以下类型的层次结构:
每个Base
类都可以(并且将覆盖 foo),而类A-F
只需要重新实现foo_impl
.
请注意,仅添加另一个可选的自定义虚拟函数(例如bar_impl
)在这里没有帮助,因为它只允许一个额外的自定义层,我可能需要一个无限的数量。
php - 使用 PHPUnit 模拟对象测试模板方法设计模式实现
假设我有模板方法设计模式实现的代码。我想在我的模板方法中测试方法调用的顺序和计数。我尝试使用 PHPUnit 模拟。我的源代码如下所示:
结果我有这样的错误:
是否可以使用模拟对象在这种情况下计算方法调用?
design-patterns - 了解模板方法模式
据我了解,模板方法只不过是调用子类中定义的虚拟或抽象方法的普通方法。我是对的,还是我错过了这种模式的其他重要内容?
如果我是对的,还有其他常见的方法来实现 Template 方法吗?