Java中的模板模式

原文链接 作者:Pankaj Kumar   译者:f0tlo <1357654289@qq.com>

模板模式是一种行为设计模式,它的实现思路是,创建一个桩方法,并且定义一些步骤让子类来实现。模板方法定义了一个算法的执行步骤,或者说能够提供一种默认的实现,这种实现概括一部分子类或者全部子类的共同部分。

举一个例子帮助理解,假设提供一种造房子的算法。算法的步骤就是模拟造房子的过程:建地基、建支撑,最后添加墙和窗户 – 1. Fundation,2. Pillars,3. Walls,4. Windows。最重要的一点就是不能改变此建造过程,比如不可能在没用地基的时候就开始建造窗户。这个例子中,我们就创建了一个模板方法 – 将使用不同的方法完成对房子的建造。

为了确保子类不能重写(override)这个模板方法,应当使用final

模板方法抽象类

因为设计为一些方法的具体实现留待子类中,所以不得不安排基类为一个抽象类

HouseTemple.java

package com.journaldev.design.template;

public abstract class HouseTemplate {

//template method, final so subclasses can't override
public final void buildHouse(){
buildFoundation();
buildPillars();
buildWalls();
buildWindows();
System.out.println("House is built.");
}

//default implementation
private void buildWindows() {
System.out.println("Building Glass Windows");
}

//methods to be implemented by subclasses
public abstract void buildWalls();
public abstract void buildPillars();

private void buildFoundation() {
System.out.println("Building foundation with cement,iron rods and sand");
}
}

buildHouse()是模板方法并定义了在建造房子过程中一系列方法的执行顺序。

WoodenHouse.java

package com.journaldev.design.template;

public class WoodenHouse extends HouseTemplate {

@Override
public void buildWalls() {
System.out.println("Building Wooden Walls");
}

@Override
public void buildPillars() {
System.out.println("Building Pillars with Wood coating");
}
}

此处也应当对其他方法进行重写,但是为了简便,此处没用完成。

GlassHouse.java

package com.journaldev.design.template;</code>

public class GlassHouse extends HouseTemplate {

@Override
public void buildWalls() {
System.out.println("Building Glass Walls");
}

@Override
public void buildPillars() {
System.out.println("Building Pillars with glass coating");
}

}

使用模板方法

用一个测试程序来测试此处已完成的模板方法。

HouseClient.java

package com.journaldev.design.template;

public class HousingClient {

public static void main(String[] args) {

HouseTemplate houseType = new WoodenHouse();

//using template method
houseType.buildHouse();
System.out.println("************");

houseType = new GlassHouse();

houseType.buildHouse();
}

}

注意,client正在调用基类的模板方法并且依赖于不同步骤的实现细节,即这些正在使用的方法,他们一些来着基类另一些来自子类。上述程序的输出:

Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.

 

模板方法的UML图

JDK中模板方法模式的使用

  • java.io.InputStream, java.io.OutputStream, java.io.Reader 以及 java.io.Writer 中所有非抽象方法。
  • java.util.AbstractList, java.util.AbstractSet 以及 java.util.AbstractMap中所有非抽象方法。

重要提示

  • 模板方法应该是由确定的步骤组成。这些步骤的顺序是固定的。基类与子类之间某些方法或者实现可以有所不同。模板方法应该是final的。
  • 大多时候,子类的调用的方法是来自于超类。但是在模板模式中,超类的模板方法调用的方法却来至于子类,这就是著名的Hollywood原则-“don’t call us, we’ll call you”。
  • 基类方法的默认实现被退化为钩子Hooks的概念,他们被设计在子类中被重写,如果你期望一些方法在子类中不被重写,你可以让他们为final。比如在例子中buildFoundation()方法是final的,因为不希望它在子类中被重写。

这就在java中全部的模板方法模式实现,希望你已经喜欢上它了。 

时间: 2024-10-09 05:55:51

Java中的模板模式的相关文章

Java中的状态模式实例教程

原文链接 作者:Pankaj Kumar 译者:f0tlo <1357654289@qq.com> 状态模式是一种行为设计模式.适用于当对象的内在状态改变它自身的行为时. 如果想基于对象的状态来改变自身的行为,通常利用对象的状态变量及if-else条件子句来扮演针对对象的不同行为.状态模式Context(环境)和State(状态)分离的方式既保证状态与行为的联动变化,又使得这种变化是条理明晰且松耦合的. Context是包含了状态引用的类,此引用指向一个状态的具体实现.并且帮助把对状态的请求委

java中的工厂模式

举两个例子以快速明白Java中的工厂模式: 女娲抟土造人 话说:"天地开辟,未有人民,女娲抟土为人."女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面. 女娲造人,这就是简单工厂模式的应用. 首先,在这个造人的思想里面,有几个重要的角色:女娲本身.抽象的人的概念和女娲所造出的一个个具体的人. 1.)女娲是一个工厂类,也就是简单工厂模式的核心角色.         2.)具休的一个个的人,包括张三,李四等.这些人便是简单工厂模式里面的具体产品角色 3.)抽象

Java中的外观模式

外观模式(Facade) 外观模式的意图是:为子系统提供一个接口,便于它的使用. 解释: 简单的说,外观模式就是封装多个上层应用需要的方法,使得上层调用变得简单,为上层提供简单的 接口,是设计模式中一种比较简单的设计思想,但是,也是最常用的一种设计模式. 举例: 当 你想吃橘子的时候,你需要做那几件事呢? 1:去买橘子 2:剥橘子 3:吃橘子 这样去一步一步的调用各个方法是不是觉得很麻烦呢?所以,我们需要做的工作就是简化这些步骤,把它封装 在一个方法中实现. 实现: 下面给出实现代码的UML图.

JAVA中的命令模式实例教程

命令模式是一种行为模式,因此,它处理的是对象的行为.命令模式为系统中不同的对象提供中性化的交流媒介.根据GoF的定义,命令模式是: 通过封装一组完全不相关的对象相互之间的的交互及通讯来完成松耦合. 允许某一个对象的行为的变化是独立于其他对象的. 在企业级应用中,命令模式是非常有用的,它使得多个对象可以相互交流.如果一些对象与另一些对象直接交流,系统组件之间是紧耦合的方式.这种方式导致系统具有更高的可维护性,可扩展的灵活性变得很低.命令模式专注于提供一个调解人介于需要交流的对象之间来帮助完成对象间

Java中的策略模式实例教程

策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把算法策略作为它的一个参数.使用这种模式最好的例子是Collection.sort()方法了,它使用Comparator对象作为参数.根据Comparator接口不同实现,对象会被不同的方法排序.详细介绍请看java中的排序对象. 本文例子是,完成一个简单地购物车,两种付款策略可供选择,一为信用卡,另

Java设计模式之模板模式(Template模式)介绍_java

Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中. 其实Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始: 复制代码 代码如下: public abstract class Benchmark { /** * 下面操作是我们希望在子类中完成 */ public abstract void benchmark(); /** * 重复执行benchmark次数 */ public final long repea

java中的访问者模式 – 例子辅导

原文链接 作者:Pankaj Kumar 译者:f0tlo <1357654289@qq.com> 访问者模式是一种行为设计模式.访问者模式被用在针对一组相同类型对象的操作.优点是,可以把针对此对象的操作逻辑转移到另外一个类上. 例如,思考一下添加不同类型商品的购物车,当点击结算的时候,它计算出所有不同商品需付的费用.现在,计算逻辑即为计算这些不同类型商品的价格.或者说通过访问者模式我们把此逻辑转移到了另外一个类上面.让我们实现这个访问者模式的例子. 为了实现访问者模式,最先需要做的是创建能够

java中的桥接模式

桥接模式的英文是 Bridge ,桥接模式关注抽象的设计.抽象是指包含了一组抽象方法的类,这些抽象方 法可能包含多个实现. 实现抽象的一般做法是创建类的层次结构,该层次结构的顶部是一个包含抽象 方法的抽象类,该类的每一个子类都提供这些抽象方法的不同实现.但是,当需要对该层次进行子类化时,这 一做法就存在不足了. 你可以创建一个桥,然后把这些抽象方法移到接口中,这样,抽象就依赖于接 口的实现. 桥接模式的意图是:将抽象与抽象方法的实现相互分离来实现解耦,以便二者可以相互独 立的变化. 上面这段话的

JAVA中的备忘录模式实例教程

备忘录模式是一种行为模式.备忘录模式用于保存对象当前状态,并且在之后可以再次使用此状态.备忘录模式实现的方式需要保证,被保存的对象状态不能被对象从外部访问,目的为了被保存的这些对象状态的完整性. 备忘录模式通过两个对象实现:Originator以及Caretaker.Originator类代表了其状态能够被存储并被用于恢复之前的状态,它使用内部类保存对象的状态.此内部类就被叫做备忘录,注意此类是私有的,它不能被其他对象访问. Caretaker是一个帮助类,它的职责就是通过备忘录帮助Origin