普通方法的方法体定义了一个语句序列。在这个语句序列中通常会出现对当前对象方法的调用,以及对其他对象方法的调用。从这种意义上说,普通的方法就是一个“模板”,它给出了计算机执行的指令序列。不过Template Method模式所涉及到的则是一个更为特殊的模板类型。
在编写一个方法的时候,考虑到算法的某些步骤可能会有不同的实现方法,我们可能会首先定义出算法的框架。这样,在定义方法的时候,我们可以将某些步骤定义为抽象方法,或者是将它们定义为存根方法(方法体为空的方法),也可以将它们定义了某个单独接口中的方法。这就产生了一个更为严格的“模板”,它明确定义了算法中的哪些步骤可以由其他类提供。
Template Method模式的目的就是在一个方法中实现一个算法,并将算法中某些步骤的定义推迟,从而使得其他类可以重新定义这些步骤。
1.经典范例:排序:
排序是Template Method模式的古代范例。排序算法这个基本过程规程,只要修改其中的一个关键步骤--对象比较,就可以对其他各种对象集合的各种属性利用这个算法。
Arrays和Collections类提供sort()静态方法,参数为一个数组,并使用可选的比较器(comparator)。ArrayList类的sort()方法是个实例方法,对sort()消息的接受者进行排序。换句话说,这些方法共享一个公共策略,这个策略依赖Comparable和Comparator接口,如图1所示:
Collections类中sort()方法使用本图中的接口
Arrays和Collection类的sort()方法允许你在需要时提供Comparator接口的实例。如果在不提供如此接口的情况下使用sort()方法,该方法将依赖Comparable接口的compareTo()方法。在对象没有实现Comparable接口的情况下,如果不提供Comparator实例就对对象进行排序,则程序会抛出异常。请注意,诸如String之类最基本的类型确实都实现Comparable接口。
sort()方法可以说是Template Method模式的一个范例;类库提供比较两个对象的关键操作,可以放入自己算法中。compare()方法返回一个小于、等于或大于0的数字。某种意义上说,这些值分别代表着:对象o1小于、等于或大于o2。例如,如下代码首先根据远地点,接着根据火箭名称,对多个火箭进行排序(火箭构造器的参数包括名称、质量、价格、远地点以及推进力)。
下面是比较程序ApogeeComparator:
package app.templateMethod;
import java.util.Comparator;
import com.oozinoz.firework.Rocket;
public class ApogeeComparator implements Comparator
{
public int compare(Object o1,Object o2)
{
Rocket r1 = (Rocket)o1;
Rocket r2 = (Rocket)o2;
return Double.compare(r1.getApogee(),r2.getApogee());
}
}
和NameComparetor:
package app.templateMethod;
import java.util.Comparator;
import com.oozinoz.firework.Rocket;
public class NameComparator implements Comparator
{
public int compare(Object o1,Object o2)
{
Rocket r1 = (Rocket)o1;
Rocket r2 = (Rocket)o2;
return r1.toString().compareTo(r2.toString());
}
}
该程序的显示内容取决于Rocket如何实现toString(),会以两种排序方式显示火箭。
排序是一种通用算法,差别只有一个步骤,与应用程序或者应用领域的细节都无关。这个关键步骤就是比较两个对象。比如,任何常见的排序算法都不包含比较火箭远地点这样的具体领域知识;在应用于具体环境时,就需要加上这种知识和实际比较对象。借助于sort()方法和Comparator接口,我们可以把明确的比较知识加入到统一排序算法中。
Template Method模式并不局限于缺失部分就是领域知识这样的情况。有时候,会将整个算法应用到具体应用领域。
2.完成算法:
- 大小: 4.6 KB
- 大小: 4.6 KB
分享到:
相关推荐
在这个例子中,`AbstractClass`是模板类,定义了`templateMethod`模板方法,它调用了`primitiveOperation1`、`primitiveOperation2`以及组件(Component)的`operation`方法。`ConcreteComponentA`和`...
在这个例子中,`AbstractClass`定义了`templateMethod`模板方法,其中`step1()`是具体实现,而`step2()`和`step3()`作为抽象方法由`ConcreteClass1`和`ConcreteClass2`这两个具体类来实现。这样,不同的具体类可以...
void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); } protected: virtual void PrimitiveOperation1() = 0; // 抽象方法 virtual void PrimitiveOperation2() = 0; // 抽象方法 ...
在"template-method-demo"这个示例中,我们可以预见到它将展示如何在Java中应用模板方法模式。这个压缩包可能包含以下内容: 1. 一个抽象类(例如:`AbstractClass`),它定义了模板方法。在这个类中,可能会有一个...
### C++设计模式课件3_Template Method_模板方法 #### 模板方法设计模式解析 模板方法模式(Template Method Pattern)是一种行为型设计模式,它允许我们定义算法的骨架,并将部分步骤推迟到子类中实现。这种模式...
模板方法模式是一种行为设计模式,它在一个方法中定义算法的骨架,将一些步骤延迟到子类中实现。 具体来说,模板方法模式的关键特点包括: 抽象类:在抽象类中定义一个模板方法,该方法给出了算法的框架。 具体...
"模板方法"(Template Method)是设计模式中的一个经典概念,它属于行为设计模式,主要用在父类中定义一个算法的框架,允许子类在这个框架内重定义特定的步骤。这个模式通常用于代码复用和保持代码结构的一致性。 ...
在模板模式中,一个抽象类公开定义了执行它的方法的方式,而将具体实现延迟到子类中。这种方式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板模式的核心结构包括抽象类(AbstractClass)...
- **抽象类(Abstract Class)**:包含一个或多个抽象方法,并且有一个模板方法(template method)。模板方法通常被声明为final,这意味着它不能被子类覆盖。 - **具体操作(Concrete Operations)**:在抽象类中...
在这个例子中,`templateMethod`是模板方法,它在`AbstractClass`中定义了算法的整体结构,而`step1`是一个需要子类实现的抽象方法,`step2`是可选的默认实现,`step3`是不能被子类重写的最终方法。 模板方法模式的...
4. **模板方法(Template Method)**:定义了算法的基本步骤,调用各个步骤的方法,可以是抽象的也可以是具体的方法。 下面是一个简单的Java模板方法模式示例,以饮料制作过程为例: ```java public abstract ...
在这个例子中,`AbstractClass` 是抽象类,`templateMethod` 是模板方法,`step1`、`step2` 和 `step3` 是基本方法,其中 `step2` 提供了一个默认实现,`step3` 是一个钩子方法,子类可以选择是否覆盖。`Concrete...
TemplateMethod(模板方法)设计模式是一种行为设计模式,它在面向对象编程中扮演着重要的角色。这个模式允许我们在抽象类中定义一个算法的框架,同时允许子类在不改变算法结构的情况下重写算法中的特定步骤。通过...
2. 模板方法(TemplateMethod):这是核心方法,定义了算法的整体结构,调用了抽象方法和具体方法。 3. 具体方法(ConcreteMethod):这些方法在抽象类中已经完全实现,子类不需要关心这部分代码。 例如,假设我们...
3. **模板方法(Template Method)**:在抽象类中定义的,它是一个具体方法,负责组织和控制算法的流程。模板方法通常包含了业务逻辑的主要流程,并调用了其他基本方法。 4. **钩子方法(Hook Methods)**:可选的...
2. 模板方法(Template Method):这是一个具体的方法,定义了算法的骨架。这个方法由抽象类实现,它调用了基本方法来执行特定的步骤。模板方法通常声明为final,防止子类重写其结构。 3. 基本方法(Primitive ...
标题“TemplateMethod.rar”暗示了这个压缩包包含的是关于Qt平台上实现模板方法设计模式的示例代码。Qt是一个跨平台的应用程序开发框架,常用于创建GUI程序,但也可用于非图形化的后台服务。 描述中的“模板方法...
4. 模板方法(Template Method):定义了算法的基本结构,包括一系列步骤,这些步骤可能包含直接调用的钩子方法。模板方法通常是不可变的,确保算法的总体流程不会被子类改变。 在iOS应用开发中,模板方法模式的...
源代码清单(按照库排列) ...com.javapatterns.templatemethod 模板方法模式 com.javapatterns.uml 统一建模语言UML介绍 com.javapatterns.visitor 访问者模式 com.javapatterns.windowadapter 缺省适配模式 ...