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

java - 将 fileSystem 对象转换为 json 和 xml

fileSystem使用复合模式创建了一个数组列表。文件系统有文件夹和文件。文件夹也可以有文件夹。使用模板方法,我需要创建将fileSystem对象转换为两种格式的类:jsonxml. 如何将fileSystem对象转换为 json 和 xml?

0 投票
1 回答
1084 浏览

generics - 不同输入参数类型和数据提取算法的设计模式

我是设计模式的新手。

我的问题是在以下情况下我使用什么模式?

我想将 AExtractor 和 BExtractor 分组,因为它需要操作类似的行为。

0 投票
1 回答
70 浏览

java - 真实场景中模板方法模式的实现

我有以下要求来构建报表构建系统。

  1. 我应该能够创建连接,其中连接可以是不同的数据库或相同的数据库。
  2. 连接实体由连接ID、数据库用户名、密码组成

  3. 我应该能够管理这些连接,例如创建、删除和更新连接。

报表生成器应使用此连接对象来构建报表并生成不同类型的输出,例如 xml、pdf、excel csv 等...

  1. 报表生成器应将输入作为连接ID 和数据库查询和输出类型,如xml、csv 等...
  2. 报告应该保存/保存在数据库中,以便我可以多次执行报告。3.系统应支持创建、删除更新报告功能。

当我执行报告时,应为每个报告重复以下步骤。步骤是

  1. 从给定的报告 ID 和连接 ID 中获取连接对象。
  2. 执行查询。
  3. 处理结果集。
  4. 生成报告。

我计划使用模板方法模式,因为构建报告步骤是固定的,并且实施可能会改变。

任何人都可以解释如何构建这些对象的构造/以及我需要在哪里安装 dao 层,或者换句话说,应该将 dao 组合成什么对象。

任何人都可以给出java类的骨架,并简要描述方法功能及其组成。由于我是设计模式的新手,因此无法适应现实世界的应用程序。

技术栈有:spring REST 和 spring DATA JPA 和 Hibernate ORM。

0 投票
1 回答
33 浏览

java - Does the ThreadPoolExecutor Apply the Template Pattern?

There are 2 hook methods in the ThreadPoolExecutor.

This technique makes me think of the template method pattern, where there are hook methods in the abstract class. However, the hook methods in the abstract class of template method do differ from that of ThreadPoolExecutor in that:

  • ThreadPoolExecutor class is concrete, whereas the class defining the hook methods in the template method pattern is abstract
  • hook methods, such as beforeExecute(Thread t, Runnable r) and afterExecute(Runnable r, Throwable t), in ThreadPoolExecutor are concrete with empty method body, whereas hook methods in abstract class of template method pattern are abstract albeit the fact that both hook methods are protected indicating that they should be overridden in their subclasses

So my QUESTIONS are:

  • does the ThreadPoolExecutor belong to template method pattern at all?
  • Is the hook method per se. an independent technique from the template method pattern?
0 投票
2 回答
144 浏览

c# - 模板方法和删除 If 语句

所以,我研究设计模式,我研究模板方法。

根据我的理解,它是一组方法(骨架),包装在抽象类的方法(操作)中(如果通过遗产完成),不同的具体子类在其中编写自己的这些方法的实现(不是全部) )。

但是我有一个疑问,如果某个具体的实体没有使用骨架的某些,也许是 2 种方法会发生什么?,这里我有一个我做的例子,这完全违反了 SRP:

具体类 SimpleCoffeeWithMilk:

另一个具体类:

主要入口点:

这个想法是摆脱那些 If 的语句,有没有办法用模板方法做到这一点,其中一些方法根据具体类执行?

我正在考虑创建接口,例如在其上ICoffeeWithMilk使用PutMilk()方法并在我的SimpleCoffeeWithMilk具体类上实现该接口,但是看着 UML,我看到的模板方法不依赖于接口。

编辑:现在想起来,我不能用接口作为,模板方法在操作中涉及到一组有序的方法,所以这些方法是在操作之外的。

编辑 2:好的,我在想那PutMilk()PutGratedChocolate()Hook 方法,也许我可以使它们成为抽象方法,并且在具体类中不要放置任何实现,甚至是未实现的异常类。有了这个,它们可以在我的模板方法中没有任何 if 语句的情况下存在。但我认为,我不确定这是否违反了 Liskov 替换原则。

编辑 3:嗯......我又在想,得出的结论是,如果这些方法是虚拟的并且在抽象类上没有实现,我不应该担心问具体类是否使用该方法,然后你写算法,如果你不使用它,那就不要,它什么也不做,它会进入下一步。

0 投票
2 回答
2187 浏览

typescript - 从 Typescript 中的非静态方法调用静态方法

我的所有层次结构中都有一些静态的东西(在这个例子中,_image)。我希望能够访问通讯员_image而不必重复代码:

这会很棒:

但它不起作用。现在我只需要:

假设这四个类有更多的方法。我不想show()在每个子类中重复该方法......但是我需要show()方法是非静态的并且_image静态访问的。

我已经阅读了这个问题https://github.com/Microsoft/TypeScript/issues/7673但不幸的是我不能在那里问,因为他们没有修复它就关闭了它。他们都没有谈到需要动态解析要调用的静态方法的问题。

0 投票
0 回答
26 浏览

servlets - 如何在不编译的情况下在 groovy-servlet 中使用模板方法?

我有一个名为 query1_action.groovy 的 groovy-servlet:

我有 query1_action.groovy、query2_action.groovy 等等,所有的 try-catch 部分都是一样的。

我想通过这部分制作一个模板方法。

在这种情况下,我不知道如何扩展某些基类,当我扩展类时,groovy servlet 无法运行。

请问怎么做?

0 投票
1 回答
47 浏览

java - 为什么 NeverSwitch 类会覆盖我的 AlwaysSwitch 类?

我正在使用模板方法。我有一个提供给我的驱动程序,它创建一个游戏并通过两个切换类之一,AlwaysSwitch 或 NeverSwitch。然后,驱动程序为 Always Switch 创建一个试用版和一个单独的 NeverSwitch 试用版。每个试验运行 100 次,并计算每个案例赢得比赛的次数。

这两个类都扩展了 Game。游戏有一个叫做switching()的抽象方法。两个交换类都继承了这个方法。我在两个类中都放了一个简单的打印语句。AlwaysSwitch有“我想换”,NeverSwitch有“我会留下”。

我的问题甚至是在创建 的 Always switch 试验中new Game g = new AlwaysSwitch();,输出始终是“我会留下来”。在 中new Game g = new NeverSwitch();,输出再次是“我会留下。”。

我已经尝试在驱动程序中注释掉 NeverSwitch 试用版,然后 AlwaysSwitch 试用版才会起作用。

我不明白为什么 neverSwitch 类覆盖了 alwaysSwitch 类?

所有结果都说“我会留下来”。

0 投票
2 回答
795 浏览

java - 模板方法和继承或组合

我有这些课程:

而且我有一些模板方法模式实现的操作。带算法的基类:

实现模板方法的两个孩子:

我的问题:

  1. 如何重写此代码以使用组合?

  2. 我是否正确理解使用模板方法时,我附加到继承?

模板方法是避免重复的好方法。但是如果它将我绑定到继承,还有什么其他方法可以避免代码重复?在我的示例中,如何使用组合?(用其他东西替换模板方法?)

0 投票
2 回答
2654 浏览

java - 工厂方法模式是模板方法模式的特例吗?

GOF 谈论“工厂方法”模式的框架。框架需要对象,但对象的实现取决于应用程序,因此创建了创建对象的抽象方法。此外,由于需要返回类型,因此定义了所需对象的接口,它定义了对象所需的 api。实际对象由子类(具体应用程序)创建。这是一种创造模式。

对于模板模式,唯一的变化是封装类不知道某些行为的实现,因此它将它抽象为一个方法,使用它,但将实现留给子类。这是行为模式。

是不是两者的唯一区别是

示例代码

现在使用上面的用户代码将继承 Application 并为createContentView().

模板方法基本特征:父类具体方法调用其抽象方法。

工厂方法:让产品创建由其子类实现。

上面的例子适合两者。事实上,工厂方法的任何示例也适用于模板方法。

所以说得好

  1. 工厂方法模式是一种专门的模板方法模式,用于获取其实现依赖于用户代码的对象,可以在子类中提供对象创建的实现
  2. 如果用于对象创建的模板模式是工厂方法模式。

我的第二个疑问:Factory方法(根据基于inberitence的GOF)是否必须从其他具体方法调用其抽象产品生产方法?

如果上面的答案是“否”,那么这意味着会有一些消费者代码将具有工厂类型的实例(组合),将调用工厂方法来获取产品的对象,并将注入具体的工厂类。但是现在这变成了抽象工厂。