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

python - 如何在 Python 中更改方法默认值?

我正在构建一个继承自另一个类 Parent 的类 Child。Parent 类有一个 Child 将使用的 loadPage 方法,但 Child 需要在接近 loadPage 函数的末尾但在函数的最终语句之前运行自己的代码。我需要以某种方式将此函数插入​​到 loadPage 中,仅用于子实例,而不是父实例。我正在考虑将 customFunc 参数放入 loadPage 并将其默认为 None 对于 Parent,但对于 Child 默认为 someFunction。

如何仅为 Child 的实例更改 loadPage 方法的默认值?还是我要解决这个问题?我觉得我可能忽略了一个更好的解决方案。

0 投票
2 回答
3060 浏览

java - 这是什么设计模式——适配器、提供者、委托、模板方法,还是......?

这是一个简单的设计模式问题:

作为我当前项目的一部分,我编写了一个接口来执行数据库搜索(使用 web 服务和相关的客户端存根)并返回结果 - 随后 struts 操作将使用该结果作为对 JSON 请求的响应。

界面是这样的:

然后对于每种特定类型的对象,将实现上述的具体版本,以便调用相关的 Web 服务并返回结果。

基本上,据我所知,它只是围绕一堆业务逻辑的包装。

问题是,你会怎么称呼它?我不喜欢提供者这个词,因为它很模糊。是否有明确定义的设计模式?

理想情况下,我更愿意顺便使用 Spring,但不幸的是我不能在这个项目中,因为它是遗留代码库的一部分......

编辑:

这是它被使用的地方:

ETC...

因此,对于特定类型的对象,实现了上述 Action 类的具体版本(顺便说一下,它是 stuts 动作),并且它将引用上述“Provider”的实现......就像这样:

希望它使它更清楚。

0 投票
3 回答
8085 浏览

python - 旨在被覆盖的属性和方法的 Python 命名约定

我在 Python 中有一些面向对象的代码,其中一些类旨在扩展以提供缺少的自定义代码位(一个 la模板方法模式,但也有变量),这些代码只会由超类使用,而不是由使用它们的客户端代码。

这种抽象(或枯燥,因为它们在超类中的实现要么是要么pass引发NonImplemented异常)方法和属性有任何样式约定吗?

我一直在浏览PEP-0008,它只提到在不打算被子类使用的私有成员前面加上下划线。

0 投票
5 回答
9279 浏览

python - 在 Python 中继承方法的文档字符串

我有一个带有文档字符串的 OO 层次结构,它需要与代码本身一样多的维护。例如,

现在,问题在于AfricanSwallow.airspeed不继承超类方法的文档字符串。我知道我可以使用模板方法模式保留文档字符串,即

_ask_arthur在每个子类中实现。但是,我想知道是否有另一种方法可以继承文档字符串,也许是我还没有发现的一些装饰器?

0 投票
5 回答
491 浏览

c++ - 用其他基类的方法满足纯抽象方法的最简单方法是什么

编辑:根据一些评论,简单的意思是a)代码更少,b)易于维护,c)很难出错。

编辑#2:此外,如果确实简化了InterfaceImpl.

目前,我知道的唯一方法是让实现者定义抽象方法并将调用委托给目标基类型的方法。例子:

起初,我认为这也许可以解决问题:

第一个 using 语句将使这两个MethodOneImpl::method1方法都公开,但它实际上不履行与 的约定Interface,并且它修改了 的可访问性MethodOneImpl::method1(int)。显然我们不能使用这个解决方案,method2因为名称不匹配。

FWIW,我有我认为的解决方案,但它根本不是标准的一部分(换句话说,它不会编译)。我正在考虑向 C++ 委员会提出建议;如果有人有任何建议,我将不胜感激下面的任何评论(但请不要将建议作为答案提交)。

0 投票
3 回答
8331 浏览

objective-c - Objective-C - 模板方法模式?

因此,我一直在阅读有关 Objective-C 模板方法的内容,并试图了解它们的特别之处。据我了解,基类中的任何方法都可以被覆盖并且可以调用超级?那么模板方法不仅仅是覆盖基类中的方法吗?

如果我错了,你能解释一下模板方法模式是什么,你能提供一个例子吗?

0 投票
1 回答
166 浏览

unit-testing - 使用模拟框架测试模板方法;是不是低级

假设我有一个调用 m1() 和 m2() 的模板方法 template()。我有 m1 和 m2 的测试。现在,在测试 template() 时,应该使用模拟来检查 m1 和 m2 是否被正确调用或测试其 API 或两者兼而有之。

我觉得检查模板算法的测试(使用模拟)是低级的,几乎就像检查每一行源代码一样。

我想听听其他人对此有何看法。

0 投票
1 回答
496 浏览

c++ - 为什么 GoF 建议在 C++ 模板方法模式实现中使用受保护(而不是私有)虚拟方法?

来自四人组关于模板方法模式:

三个实施问题值得注意:

  1. 使用 C++ 访问控制。在 C++ 中,模板方法调用的原始操作可以声明为受保护成员。这确保它们仅由模板方法调用。必须被覆盖的原始操作被声明为纯虚拟的。模板方法本身不应该被覆盖;因此,您可以使模板方法成为非虚拟成员函数。

“这确保了它们只被模板方法调用。” 不是真的,是吗?由于原始方法(例如,如果有些是虚拟的而不是纯虚拟的)也可以从派生类中调用。仅将原始方法声明为私有可确保它们仅由模板方法调用,这不是真的吗?然后,私有虚拟原始方法仍然可以在子类中实现(或重新实现)以提供在超类的模板方法中定义的算法中所需的特殊行为。

参见 Herb Sutter 的“虚拟性”:

http://www.gotw.ca/publications/mill18.htm

他说:

准则 #2:更喜欢将虚拟函数设为私有。准则#3:只有当派生类需要调用虚函数的基实现时,才使虚函数受到保护。

我在 GoF 模板方法模式中没有看到派生类调用虚函数的基类实现的任何要求,那么为什么四人组建议将这些函数设为受保护而不是私有呢?

0 投票
1 回答
773 浏览

java - 使用模板方法模式实现工作链?

我有一个层次结构的worker类,所有这些都对工件进行某种处理。这个想法是,每个工人做一些预处理,将工件推到子类,然后做一些后处理:

现在我通过声明新的抽象方法来解决这个问题:

这有一个明显的缺点,即对于每个层次结构级别,都有一个额外的新方法。

我想保证,即使使用不受我控制的新的、用户实现的工作人员,也会执行所有预处理和后处理方法。

你会怎么做?

0 投票
1 回答
284 浏览

java - 如何循环遍历列表使用模板方法模式?

我正在寻找 Java 中模板方法模式的示例实现。例如,假设我想创建一个通用类,它可以循环List<T>并执行一个模板方法,并在列表中的void execute(T t)每个类型项上执行签名。T