问题标签 [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 投票
3 回答
172 浏览

c++ - 在 C++ 中,如何在基函数中访问派生类的成员?(这甚至是正确的做法吗?)

我正在用 C++ 编写一个物理程序,以使用几种算法来近似对象的范围。我已经声明了一个包含具体和抽象方法的基类 Simulation。(例如,近似范围的函数是纯虚函数,而获得下一个位置的函数是具体的,因为无论算法如何,这都是相同的。)为了定义这些具体的方法,我已经在基类中声明了所有变量也是。在派生类中,我定义了基类的抽象方法和新的、特定于算法的方法;这要求我在基类和派生类中都定义成员。

问题是基类中定义的具体方法正在访问基类的成员,而不是派生类中定义的覆盖方法。有没有办法做到这一点,还是我的方法本身不正确?

我对构造函数也有类似的问题;从派生类的构造函数调用基构造函数正在初始化基成员。

无论如何,谢谢你的时间。虽然我对 C++ 并不完全陌生,但我更倾向于将它用作 C;我对面向对象的概念相当缺乏经验。我可能犯了一个非常基本的错误(或更可能是设计缺陷),但除了在派生类中重新定义方法之外,我还没有发现任何类似的东西或从测试中得到任何积极的结果。(我假设我应该避免这样做)

更新:尽管按照 R Sahu 的要求使成员受到保护(感谢 Ozraptor;不太确定我是如何错过的),但我将发布一些我的(现已更新的)代码:

基类:

派生类之一:

0 投票
3 回答
1100 浏览

c# - 每个实现需要不同参数的模板方法模式?

我有一个需要身份验证算法的基本抽象类。我有两个实现,一个将散列密码并将其与存储的散列进行比较,另一个将使用 Windows 活动目录。

但在实际进行哈希检查或 Windows 身份验证之前,我有绝对必须实现的额外工作流逻辑。因此,无论身份验证的算法如何,都必须始终以相同的方式修改或使用诸如 failedPasswordCount、lastAuthenticationAttemptDate、IsUserApproved 等内容。

在我看来,这个问题似乎可以使用模板方法模式来解决,只是实现我的两种身份验证方法所需的信息因使用的一种而不同。

解决此问题的最佳方法是什么?是否有另一种已知模式已经解决了这个问题?或者任何人有一个好主意?

0 投票
2 回答
71 浏览

multithreading - 线程上下文中的模板方法

假设我们有一个看起来像这样的模板方法

从类继承的子类Wroker应该实现该DoRealJob()方法,当实现在同一个线程下运行时一切正常,方法的三个部分DoJob()按此顺序执行

  1. 工作前()
  2. DoRealJob()
  3. 工作后()

但是当DoRealJob()在另一个线程下运行时,AfterJob()可能会在DoRealJob()完成之前执行

我的实际解决方案是让子类调用AfterJob(),但这并不能防止子类忘记调用它,而且我们失去了模板方法的好处。

尽管DoRealJob()阻塞与否,还有其他方法可以获得一致的调用顺序吗?

0 投票
1 回答
121 浏览

java - 无状态模板方法实现

假设我有一个 Strategy 接口:

以及实现它的模板方法:

我有一个具体的子类:

但是由于它需要记住方法调用之间的一些中间结果,所以它不是无状态的。无状态类有几个优点,例如它们是自动线程安全的。

所以问题是:如何在利用模板方法的同时使 ConcreteStrategy 无状态?

编辑)澄清:接口和模板方法类的发布方法都不能改变。

(注意,这个问题我已经解决了,会自己回答,但我会给别人一个机会来解决它)

0 投票
1 回答
732 浏览

android - “android 活动生命周期”是否使用模板方法模式?

我相信模板方法模式涉及封装算法中的每个步骤。

我认为活动的生命周期(onCreate、onResume 等)是具体类必须覆盖的步骤。

这是否意味着 Android 活动生命周期(活动和片段类)符合模板设计模式,或者是否有更适合它的不同模式

谢谢

0 投票
1 回答
42 浏览

design-patterns - 模板方法模式的关键策略是什么

在一次采访中,我被问及模板方法模式的关键策略。我回答了继承。这是正确的答案吗?如果有人能指引我正确的方向?提前致谢。

0 投票
1 回答
280 浏览

java - Java模板方法模式

我试图在一些 JavaEE bean 中按照模板方法模式的方式实现一些东西,这些 bean 对数据集进行一些处理工作。

每个处理 bean 接受 Job 对象,做一些工作然后为下一个 bean 返回更新后的作业(总共大约 10 个),每个 bean 有一个同名的方法(doProcessing)和一个参数(job)

我想在每个 bean 'doProcessing' 方法的开始和结束时执行一些日志记录,以便在处理结束时作业包含来自每个 bean 的日志记录信息(存储在 hashmap 等中)

我当前的实现看起来像这样......

但我知道我可以做得比这更好,使用继承我应该能够创建一个超类......

任何扩展超类的类都将自动执行预处理/后处理操作......

但是我一直无法弄清楚如何准确地实现这一点,因为所有示例都引用了 POJO,并且由于我的 bean 是 @Stateless,因此没有构造函数。

有人可以提供一些指导吗?我在吠叫错误的树吗?

0 投票
2 回答
327 浏览

java - 带返回值的模板方法

我有一个算法的大纲 - 一些必须按特定顺序执行的逻辑步骤。算法的结果必须是某个数字。这自然让我想到了使用模板方法模式。这适用于void方法,但我的问题来了:算法中的每个步骤都不是void方法,但允许返回一个数字(所以它们是int方法) - 如果一个步骤返回一个非零数字,这个数字就是算法执行的结果,如果它为零 - 执行继续下一步。

这听起来可能真的很微不足道,但我仍然觉得有这样的东西有点难看:

当然step1()step2()等等都是抽象方法,在扩展我的相应类中有自己的具体实现。

我想到的另一个想法是使用异常,但是当我们在这里讨论控制流时,这将是一种反模式。

我在这里遗漏了什么还是这只是我必须写的方式?

0 投票
2 回答
141 浏览

c++ - 当对象具有值语义时,在方法中内联虚函数

考虑以下带有模板方法设计模式的代码:

我想知道编译器是否能够在案例 1 和 2 中内联/取消虚拟化“doSomething()”成员函数。如果它为 templateMethod() 创建 3 段不同的二进制代码,这是可能的:一个没有内联,2内联 A::doSomething() 或 B::doSomething() (在情况 3、1 和 2 中必须分别调用)

您知道标准是否需要这种优化,或者是否有任何编译器实现它?我知道我可以用 CRT 模式而不是虚拟来实现相同的效果,但意图会不太清楚。

0 投票
1 回答
243 浏览

java - 模板方法调用 super 并使用实现

我已经实现了模板方法,我遇到了这种情况:

我的疑问是..可以调用一个超级方法,如果在这个超级方法中有一个方法调用并且我重写了这个方法,那么这个类将使用什么方法实现?

解决方案:好的,它工作正常。但是当我有一个类调用一个方法被覆盖时,有这个没用: