问题标签 [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.
c++ - 在 C++ 中,如何在基函数中访问派生类的成员?(这甚至是正确的做法吗?)
我正在用 C++ 编写一个物理程序,以使用几种算法来近似对象的范围。我已经声明了一个包含具体和抽象方法的基类 Simulation。(例如,近似范围的函数是纯虚函数,而获得下一个位置的函数是具体的,因为无论算法如何,这都是相同的。)为了定义这些具体的方法,我已经在基类中声明了所有变量也是。在派生类中,我定义了基类的抽象方法和新的、特定于算法的方法;这要求我在基类和派生类中都定义成员。
问题是基类中定义的具体方法正在访问基类的成员,而不是派生类中定义的覆盖方法。有没有办法做到这一点,还是我的方法本身不正确?
我对构造函数也有类似的问题;从派生类的构造函数调用基构造函数正在初始化基成员。
无论如何,谢谢你的时间。虽然我对 C++ 并不完全陌生,但我更倾向于将它用作 C;我对面向对象的概念相当缺乏经验。我可能犯了一个非常基本的错误(或更可能是设计缺陷),但除了在派生类中重新定义方法之外,我还没有发现任何类似的东西或从测试中得到任何积极的结果。(我假设我应该避免这样做)
更新:尽管按照 R Sahu 的要求使成员受到保护(感谢 Ozraptor;不太确定我是如何错过的),但我将发布一些我的(现已更新的)代码:
基类:
派生类之一:
c# - 每个实现需要不同参数的模板方法模式?
我有一个需要身份验证算法的基本抽象类。我有两个实现,一个将散列密码并将其与存储的散列进行比较,另一个将使用 Windows 活动目录。
但在实际进行哈希检查或 Windows 身份验证之前,我有绝对必须实现的额外工作流逻辑。因此,无论身份验证的算法如何,都必须始终以相同的方式修改或使用诸如 failedPasswordCount、lastAuthenticationAttemptDate、IsUserApproved 等内容。
在我看来,这个问题似乎可以使用模板方法模式来解决,只是实现我的两种身份验证方法所需的信息因使用的一种而不同。
解决此问题的最佳方法是什么?是否有另一种已知模式已经解决了这个问题?或者任何人有一个好主意?
multithreading - 线程上下文中的模板方法
假设我们有一个看起来像这样的模板方法
从类继承的子类Wroker
应该实现该DoRealJob()
方法,当实现在同一个线程下运行时一切正常,方法的三个部分DoJob()
按此顺序执行
- 工作前()
- DoRealJob()
- 工作后()
但是当DoRealJob()
在另一个线程下运行时,AfterJob()
可能会在DoRealJob()
完成之前执行
我的实际解决方案是让子类调用AfterJob()
,但这并不能防止子类忘记调用它,而且我们失去了模板方法的好处。
尽管DoRealJob()
阻塞与否,还有其他方法可以获得一致的调用顺序吗?
java - 无状态模板方法实现
假设我有一个 Strategy 接口:
以及实现它的模板方法:
我有一个具体的子类:
但是由于它需要记住方法调用之间的一些中间结果,所以它不是无状态的。无状态类有几个优点,例如它们是自动线程安全的。
所以问题是:如何在利用模板方法的同时使 ConcreteStrategy 无状态?
(编辑)澄清:接口和模板方法类的发布方法都不能改变。
(注意,这个问题我已经解决了,会自己回答,但我会给别人一个机会来解决它)
android - “android 活动生命周期”是否使用模板方法模式?
我相信模板方法模式涉及封装算法中的每个步骤。
我认为活动的生命周期(onCreate、onResume 等)是具体类必须覆盖的步骤。
这是否意味着 Android 活动生命周期(活动和片段类)符合模板设计模式,或者是否有更适合它的不同模式
谢谢
design-patterns - 模板方法模式的关键策略是什么
在一次采访中,我被问及模板方法模式的关键策略。我回答了继承。这是正确的答案吗?如果有人能指引我正确的方向?提前致谢。
java - Java模板方法模式
我试图在一些 JavaEE bean 中按照模板方法模式的方式实现一些东西,这些 bean 对数据集进行一些处理工作。
每个处理 bean 接受 Job 对象,做一些工作然后为下一个 bean 返回更新后的作业(总共大约 10 个),每个 bean 有一个同名的方法(doProcessing)和一个参数(job)
我想在每个 bean 'doProcessing' 方法的开始和结束时执行一些日志记录,以便在处理结束时作业包含来自每个 bean 的日志记录信息(存储在 hashmap 等中)
我当前的实现看起来像这样......
但我知道我可以做得比这更好,使用继承我应该能够创建一个超类......
任何扩展超类的类都将自动执行预处理/后处理操作......
但是我一直无法弄清楚如何准确地实现这一点,因为所有示例都引用了 POJO,并且由于我的 bean 是 @Stateless,因此没有构造函数。
有人可以提供一些指导吗?我在吠叫错误的树吗?
java - 带返回值的模板方法
我有一个算法的大纲 - 一些必须按特定顺序执行的逻辑步骤。算法的结果必须是某个数字。这自然让我想到了使用模板方法模式。这适用于void
方法,但我的问题来了:算法中的每个步骤都不是void
方法,但允许返回一个数字(所以它们是int
方法) - 如果一个步骤返回一个非零数字,这个数字就是算法执行的结果,如果它为零 - 执行继续下一步。
这听起来可能真的很微不足道,但我仍然觉得有这样的东西有点难看:
当然step1()
,step2()
等等都是抽象方法,在扩展我的相应类中有自己的具体实现。
我想到的另一个想法是使用异常,但是当我们在这里讨论控制流时,这将是一种反模式。
我在这里遗漏了什么还是这只是我必须写的方式?
c++ - 当对象具有值语义时,在方法中内联虚函数
考虑以下带有模板方法设计模式的代码:
我想知道编译器是否能够在案例 1 和 2 中内联/取消虚拟化“doSomething()”成员函数。如果它为 templateMethod() 创建 3 段不同的二进制代码,这是可能的:一个没有内联,2内联 A::doSomething() 或 B::doSomething() (在情况 3、1 和 2 中必须分别调用)
您知道标准是否需要这种优化,或者是否有任何编译器实现它?我知道我可以用 CRT 模式而不是虚拟来实现相同的效果,但意图会不太清楚。
java - 模板方法调用 super 并使用实现
我已经实现了模板方法,我遇到了这种情况:
我的疑问是..可以调用一个超级方法,如果在这个超级方法中有一个方法调用并且我重写了这个方法,那么这个类将使用什么方法实现?
解决方案:好的,它工作正常。但是当我有一个类调用一个方法被覆盖时,有这个没用: