模板方法设计模式

GoF原文

Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.

当完成一个操作具有固定的流程时,由抽象固定流程步骤,具体步骤交给子类进行具体实现(固定的流程,不同的实现)

在这里插入图片描述

模板方法模式适用于以下应用场景

(1)一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
(2)各子类中公共的行为被提取出来,集中到一个公共的父类中,从而避免代码重复。

在这里插入图片描述

Abstract Class

由于我们希望一些方法由子类实现,所以必须将基类设置为抽象类
为了确保子类不会重写模板方法,我们应该将其设置为final

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 buildFoundation() {
        System.out.println("Building foundation with cement,iron rods and sand");
    }

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

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

    public abstract void buildPillars();
}

其中buildHouse()是模板方法,它定义了执行几个步骤的执行顺序。

Concrete Classes

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");
    }
}
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");
    }
}

使用

public class Main {
    public static void main(String[] args) {
        HouseTemplate houseType;

        houseType = new WoodenHouse();
        houseType.buildHouse();

        System.out.println("************");

        houseType = new GlassHouse();
        houseType.buildHouse();
    }
}

结果

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.

在这里插入图片描述

模板方法模式在JDK源码中的应用

Thread的run和start就是一个比较典型的模板设计模式

java.io.InputStream,
java.io.OutputStream,
java.io.Reader
java.io.Writer.
的所有非抽象方法

java.util.AbstractList,
java.util.AbstractSet
java.util.AbstractMap
.
的所有非抽象方法。

比如:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
...
    abstract public E get(int index);
...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值