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

java - 抽象类和模板方法模式和 HttpServlet

HttpServlet用关键字abstract声明 的抽象类中没有任何抽象方法。doGet和其他不是抽象方法。那么为什么HttpServlet声明为抽象类而没有任何抽象类呢?

HttpServlet模板方法模式的一个例子吗?

什么是模板模式和模板方法模式。有什么区别?

0 投票
1 回答
2844 浏览

c++ - 使用工厂时如何“隐藏”构造函数?

我遇到了一种情况,我想从构造函数中调用一个虚拟方法。这当然是不可能的(或者至少它不会产生所需的行为)。在这个答案中,作为一种解决方法,建议使用工厂方法。我写了这样的东西:

它是一种模板方法模式。每个派生类都可以自定义其构造方式。但是,只有当此类的用户无法调用构造函数或afterConstruction()直接调用时,整个构造才有意义。因此,我希望将它们都设为私有。也许这是一个愚蠢的问题,我只是没有看到明显的问题。也许我可以通过使用友谊或类似的东西来实现这一点,但我不确定这是否是最好的方法。隐藏这两种方法并只允许通过工厂方法创建对象的一种干净整洁的方法是什么?

编辑:Ka7Im1011 让我意识到,我的要求并不清楚。因此,我将尝试澄清:

我想编写一个其他人必须从中派生的基类。构造派生对象涉及到非常具体的东西,我想远离基类。在网上搜索虚拟构造函数时,我发现了上面提到的问答,我认为工厂方法可以很好地工作。但是,我不确定如何实现以下目标:

  • 应该只能从工厂创建 Derived 的实例。否则,可以在不一致的状态下创建派生对象。(我想仅在基类中我无法强制执行此操作,但要求 Derived 的每个编码器将构造函数设为私有/受保护就足够了。)
  • 如果可能,Derived 应该只实现 Base 的纯虚拟方法,因为这样编写 Derived 就非常舒服(IDE/编译器将准确地告诉您必须实现什么,而不是在例如模板接口时出现冗长且有时神秘的错误消息参数必须实现)
0 投票
1 回答
226 浏览

design-patterns - 如何设计抽象监听器及其实现?

我决定将我的应用程序分成 3 个单独的模块 - 一个包含几乎所有应用程序逻辑的“抽象”(任何查看代码的人都可以知道它做了什么),一个包含所有特定实现层(如数据库、连接、等)和一个小的“运行时”模块,它用抽象映射实现(配置工厂等)并启动应用程序。

所以我有一个抽象的 PortListener 类,可以处理从端口接收到的特定消息。大部分逻辑都在这个类中完成,只有特定的实现细节(如端口打开、关闭、从端口读取字节并将其转换为域消息)被移动到 PortListenerImplementation。PortListener 具有称为“listen()”的抽象方法——它应该打开端口并将自己作为监听器添加到端口,以及“close()”——删除监听器,关闭端口。还有一种名为“handleMessage(Message message)”的方法可以处理消息并做任何需要的事情。

如何强制 PortListenerImplementation 在其自己的“真实”侦听器方法中调用“handleMessage()”?有没有类似反向模板方法的东西?还是我走得太远了?:D

谢谢

0 投票
2 回答
189 浏览

ruby - Rspec:如何正确测试模板方法模式?

给定两个使用模板方法设计模式的类:

在 Rspec 中测试这个的正确方法是什么?我应该shared_examples_for "a parent"像这样创建然后it_should_behave_like 'a parent'在两个类中使用测试吗?:

或者我应该测试它Child是父级,并且只测试它覆盖的钩子方法?

0 投票
1 回答
90 浏览

java - 在 Java 中向 List 添加功能

我需要在 List<> 的任何实现上添加以下功能: - 结果对象永远不应显示正索引的 OutOfBounds 异常 - 当您使用 x=size 调用 get(x) 时,它将自动增加列表直到大小 x+1,并将用程序员希望的任何内容(NULL 除外)填充新创建的空间 - 请记住,List 应该是通用类型 - 否则,它应该像普通 List 一样工作

我知道我至少需要使用装饰器模式来添加功能,但是,我觉得还应该使用其他一些设计模式——也许是工厂或模板,但我不确定如何使用。

任何人都可以请至少提供一些关于我如何解决上述任务的提示吗?

0 投票
1 回答
79 浏览

design-patterns - 模板方法模式的实现中可以有多个模板方法吗?

模板方法模式实现中的抽象类可以有多个模板方法吗?

0 投票
3 回答
4086 浏览

java - 为什么 JdbcTemplate 是模板方法设计模式的一个例子

当我的注意力被 SO 上的这个问题吸引时,我正在阅读有关设计模式的内容,特别是有关模板方法的内容。

在阅读了解释和具体代码之后,我仍然想知道为什么这是“模板方法”设计模式的一个例子。

根据 GoF 的说法,这种模式的意图是:

“在操作中定义算法的骨架,将一些步骤推迟到子类。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。”</p>

并有两个参与者:

AbstractClass :
- 定义具体子类定义的抽象原始操作以实现算法的步骤
- 实现定义算法骨架的模板方法。模板方法调用原始操作以及在 AbstractClass 中定义的操作或其他对象的操作。
ConcreteClass
实现原始操作以执行算法的子类特定步骤。


为什么“JdbcOperations”中的代码被认为是“模板方法”设计模式?

  • 我没有看到在超级/抽象类中定义了任何“全局/通用”算法,即使我将它与类似文件中的代码(如“JmsTemplate”)进行比较。
  • 在具体类中实现的功能都没有在超类中定义。所有定义的方法都是通过使用接口添加的,在本例中是接口“JdbcOperations”,实际上没有一个方法会覆盖父级中的方法。

我知道它对于消除样板代码非常方便 。但为什么这是一个模板方法,而不仅仅是一个漂亮的编码技巧。对我来说,它看起来不像模板方法所具有的任何特征。

0 投票
0 回答
256 浏览

python - 如何用功能样式替换模板方法模式?

你可以在这里看到代码

我试图解决的具体问题是这个。假设我需要使用存储在数据库中的一些工具为一些建模的实体(在我的例子中是 sqlalchemy)提供 REST 接口。说这个集合叫做父母。

我需要这样的处理程序

从概念上讲,所有这些处理程序都非常相似。他们都从 url 获取 id,然后创建适当的查询。然后他们使用该查询获取数据,然后将此数据转换为 dict,然后调用jsonify以创建正确的 http 响应。

因此,使用 OOP,我可以这样设计。

规范是一个函数,它接受一些参数和查询,并根据这些参数生成更精细的查询。

因此,例如 GET /parents?spec={'name': 'by_name', 'args': ['adam'} 将从集合中返回名为 Adam 的父级。

这段代码有一些缺陷,但我希望你能看到模板方法如何在这里实现控制流,子类可以改变它们如何创建查询、如何获取数据(项目处理程序需要调用 query.one() 和集合处理程序将需要调用 query.all() 例如)

所以我可以用依赖注入替换create_query、fetch_data。但这会产生一个问题,即有人可能通过提供错误的依赖项来创建错误的配置。这基本上就是我所做的,但使用部分函数代替。

所以我现在想的是,我可以通过为我需要的每种类型的处理程序创建工厂函数来解决这个问题,这会给处理程序提供适当的依赖。

这与我认为的模板方法解决方案非常相似。区别基本上在于,在模板方法中,正确性依赖关系由对象类型保证,而在我的解决方案中,它由工厂函数的类型保证。

我的想法已经够多了,我想知道您对此有何看法?功能世界中的人们如何解决这类问题?

0 投票
2 回答
800 浏览

java - JDK中的模板设计模式,找不到定义要按顺序执行的方法集的方法

我正在阅读关于Template design pattern. 根据我目前的理解,当我们有一个具有定义的过程(方法)集的算法要按顺序完成时,可以使用模板设计模式。主要球员是

1.Abstract Template class提供template method定义流程(方法)和执行顺序。通常这个方法是最终的,所以它的行为不会被修改。模板方法中提到的进程(方法)很少提供默认实现,其他依赖于扩展抽象模板类类型的具体类保留为抽象。

2 Concrete classes extending the Template method.. 如果需要,它们会覆盖默认方法,并为抽象模板类中定义的抽象方法提供实现。

我尝试在 JDK 中搜索它的实现,java.io在阅读了这些类实现了这种模式后,我查看了类。我找不到任何定义一组流程(方法)和执行顺序的方法。

请提供您宝贵的意见。

0 投票
3 回答
86 浏览

java - 只能从超类(C++ 和其他语言)访问的方法

假设我有一个提供公共模板方法的超类。子类必须实现一些子操作。我如何声明这个子操作以确保它们只能被调用SuperClass?有protected,但据我所知,这是相反的:子类可以访问受保护的超类成员。我想允许超类(并且只有超类!)调用子类成员。

我目前正在使用 C++ 和 Matlab,但我也对考虑其他语言的一些一般性评论非常感兴趣。