我们应该在哪里使用模板方法 - 模式?(Where should we use Template M

2019-07-22 06:05发布

任何人都可以让我知道一些示例情况下模板方法 - 应使用模式?

给我从自己的经验,一些现实世界中使用。

(I迄今发现它仅适用于在DA层映射数据是有用的。对不起!!!)

Answer 1:

我想给你一些真实世界的例子,并且应当使用模板方法模式的常见情况。

  • 当你想你的程序是“对扩展开放”,也是‘对修改关闭。’这意味着,该模块的行为可以扩展,使得我们可以在新的和不同方式的模块表现为应用程序的要求变化,或以满足新应用的需要。然而,这样的模块的源代码是不可侵犯,没有人被允许使源代码更改。在下面的例子中,可以添加工资计算的新的方式(如远程类),不改变以前的代码。

     public abstract class Salary { public final void calculate() { System.out.println("First shared tasks is done."); getBaseSalary(); System.out.println("Second shared tasks is done."); } public abstract void getBaseSalary(); } public class Hourly extends Salary { @Override public void getBaseSalary() { System.out.println("Special Task is done."); } } public class Test { public static void main(String[] args) { Salary salary = .... salary.calculate(); } } 
  • 当你面对的是通过推迟只是你的算法的一些步骤重复代码的许多同一直线上。 当你实现一个方法的内容或功能,你可以找到你的代码的某些部分是从一种类型到另一种类型的不同而不同。 此部分的特征是一个可以重新定义或修改的方法或函数的这些部分而不改变算法的(方法或功能)主要结构。 例如,如果你想没有这个模式,你将面对这个样本来解决这个问题:

function0:功能1:...功能N:

1       1               1
2       2               2
...     ...             ...
5       6               n
3       3               3
4       4               4
...     ...             ...

正如可以看到,部分鳕5,6,n为不同的从一个功能到另一种功能而改变,但是已经共享部分,如1,2,3,4是重复的。 让我们考虑与著名的Java库的一个解决方案。

public abstract class InputStream implements Closeable {

    public abstract int read() throws IOException;

    public int read(byte b[], int off, int len) throws IOException {
        ....

        int c = read();
        ....
    }

    ....

}

public class ByteArrayInputStream extends InputStream {  

    ...

    public synchronized int read() {
        return (pos < count) ? (buf[pos++] & 0xff) : -1;
        }
    ...
}
  • 当你作为一个框架的设计者,想你的客户只需为使用作为参数传递给你的框架,预计回调(执行)这样的说法在给定时间传递的任何可执行代码。 这种执行可能是直接在同步回调,也可能在稍后的时间发生在异步回调。 让我们考虑有名的一个。

     public abstract class HttpServlet extends GenericServlet implements java.io.Serializable { protected void doGet(HttpServletRequest req, HttpServletResponse resp) { ... } protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { .... doGet(req, resp); ... } ... } } public class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //do something ... } ... } 


Answer 2:

一个模板方法图案提供了一种用于执行任何排序算法或操作的骨架,并且它允许所述子类的逻辑的重新定义的一部分。

优点:天然适合建设框架,使框架父类可以使回调到孩子实现的方法。

例子:

  • java.util.AbstractList中
  • servlet的doGet和doPost方法
  • MDB的onMessage方法
  • Struts Action类
  • Spring的数据访问类

缺点:限制你在Java单继承。



Answer 3:

Template Method模式的应用有两个主要特点:

  1. 有一个基类(在Java中,一个只与protected构造和任选声明为abstract ,这将在客户机代码被继承)。
  2. 两种基团的方法在基类定义:a)一种或多种模板的方法 (通常仅一个)和一个或多个原语操作方法(通常超过一个)。 每个模板方法表示高级别操作时,在基类本身在原语操作,这意味着可以实现/重写在每个特定的子类的术语来实现。 通常情况下,模板方法是公共的和非可覆盖( final ,在Java); 它的API文档必须精确地指定其原始的操作方法调用,当(也就是说,它必须描述“算法”)。 原语操作的方法,其代表在算法的一个步骤,应当是非公共但可重写的( protected ,在Java),并且可以是两种类型:a)在必须在子类实现的抽象方法; b)用默认/空实现其在子类中被覆盖的方法。

在Java 6 SDK的一个很好的例子是execute()的方法javax.swing.SwingWorker类(它是一个public final void的方法)。 在这种情况下,原语操作的方法是doInBackground() process(List)done() 。 第一个是抽象的,因此需要在子类中的实现; 它是由在后台线程模板方法调用。 其它两个具有空的实施方式和可任选地在子类被重写; 他们在和处理,分别结束时调用,在EDT(Swing事件分派线程),以允许更新到用户界面。

在我自己的经验,我有时用这个模式。 一种这样的情况下是一个Java基类实现java.util.Iterator接口,其中, next()是模板的方法和只有一个负责实例特定域实体类原语操作的方法(这是指迭代时使用以上)持久域实体对象的列表,使用JDBC。 在该相同的应用程序的更好的例子是一个基类,其中所述模板的方法来实现意在填充“业务实体维护画面”(使用摆动)从持久实体的给定列表的多步算法; 原语操作的方法被称为为1)清除当前屏幕状态,以及2)在画面内的表格视图添加的实体; 可选,其他基本操作从模板方法称为如果屏幕为可编辑的。

最后,我必须说,虽然这肯定是一个有益的设计模式,不是经常的情况出现在那里真的是适用的。 只要有与获得在子类中重写(一个更普遍的情况,在我的经验)方法的一个基类是不够的,其本身有资格作为该模式的一个应用。



Answer 4:

在模板方法,最重要的是,你必须定义一系列的抽象方法的步骤或算法,让子类替代与这些方法的具体实施。

我的文档生成程序的一个应用。

public abstract DocumentGenerator() 
{
   generateHeader();
   generateBody();
   generateDetails();
}
public HTMLDocGenerator : DocumentGenerator()
{
   public override generateBody()
   {
     //generate as in html format
   }
}

你可以有不同的实现,如PDF生成CSV发生器和这里的价值是他们comform的算法(生成 - >标题,正文,细节)。



Answer 5:

当有许多实现的算法应该使用的模板模式。 该算法在基类的一个函数来定义和实现是由基类和子类来完成。 具有实时例子详细说明中给出http://preciselyconcise.com/design_patterns/templatemethod.php



Answer 6:

我就勾勒一个真实的例子,我使用了一些模板的方法。

在C ++计算机视觉算法应用的算法的行为的目的是要承担一对夫妇基于根据塞进在启动时加载的配置文件的枚举在运行时读取某些选项的算法行为口味。 该算法的整体框架,不同的是在原本经的代码相同的部分将被残酷重复刚才的那一级调用不同功能的中间塞上一些关键回调相同。 这些回调我想用被抽象成模板方法基类和模板方法模式防止所有的代码重复。 我们使用的枚举基本上决定什么子类实例化我我的基类指针指向,因此放贷算法及其相关的味道行为位。

现在一些背后的各种运行算法的口味的动机之一是在线VS软件的离线功能,控制我们的仪器。 离线风味很拽更丰富的调试/诊断输出,并保持局部坐标系的一些图像像素,而网上的味道把每一件事情在绝对坐标空间,并保持特定于和它的所有机器人的运行状态的仪器并没有什么顾虑。 另一个枚举开一组,我们使用一些机器学习,以及因为不同的分类分别在不同的组,通过代码的机构另有流相同数据的受过训练的,但需要以不同的方式解释一些管理条件如何根据分类中选择这些数据被创建。

我相信这种使用情况下,我从了所谓的站起身不得不在中间有孔的问题。



Answer 7:

我已经使用业务逻辑模板的方法,其中多个组件共享相同的过程,但实施略有不同。



Answer 8:

模板方法定义的算法的骨架结构,但推迟某些步骤和细节到子类。 的结构和算法的流程保持不变,但这些步骤的细节被推迟到子类。

我用模板方法模式编写文档内容。 有许多不同种类的每一种类型都有自己的小的修改文件。 然而,文件编制的主要过程是相同的所有。



文章来源: Where should we use Template Method - pattern?