设计模式 之 模板模式

120 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

模板模式

设计模式:解决问题的方案。最早起源于建筑领域。后来被应用到计算机领域。只要遇到相同问题,直接按照这种方式做就可以解决问题。在java中设计模式有23种。我们今天学习第一个设计模式:模板模式。

模板设计模式是一种行为设计模式,一般是准备一个抽象类,将部分逻辑以具体方法实现(带方法体),然后声明一些抽象方法,这样可以强制子类实现剩余的逻辑。不同的子类以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板设计模式能达成的功能。

适用于一些复杂操作进行步骤分割、抽取公共部分由抽象父类实现、将不同的部分在父类中定义抽象实现、而将具体实现过程由子类完成。对于整体步骤很固定,但是某些部分易变,可以将易变的部分抽取出来,供子类实现。

角色:

抽象类:

1)定义了一个或多个抽象方法,以便让子类实现。这些抽象方法叫做基本操作,它们是一个顶级逻辑的组成步骤。

2)定义带方法体的方法。这些方法一般是一个具体方法(带方法体),它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。

具体类:

1) 实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。

2) 每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

实现抽象类中的抽象方法,完成特定的算法

我们现在使用抽象类设计一个模板模式的应用,例如在小学的时候,我们经常写作文,通常都是有模板可以套用的。假如我现在需要定义新司机和老司机类,新司机和老司机都有开车功能,开车的步骤都一样,只是驾驶时的姿势有点不同,新司机:开门,点火,双手紧握方向盘,刹车,熄火老司机:开门,点火,右手握方向盘左手抽烟,刹车,熄火。我们可以将固定流程写到父类中,不同的地方就定义成抽象方法,让不同的子类去重写,代码如下:

// 司机开车的模板类
public abstract class Driver {
    public void go() {
        System.out.println("开门");
        System.out.println("点火");
        // 开车姿势不确定?定义为抽象方法
        ziShi();
        System.out.println("刹车");
        System.out.println("熄火");
    }
​
    public abstract void ziShi();
}

现在定义两个使用模板的司机:

public class NewDriver extends Driver {
​
    @Override
    public void ziShi() {
        System.out.println("新司机双手紧握方向盘");
    }
}
​
public class OldDriver extends Driver {
    @Override
    public void ziShi() {
        System.out.println("老司机右手握方向盘左手抽烟...");
    }
}

编写测试类

public class Demo02 {
    public static void main(String[] args) {
        NewDriver nd = new NewDriver();
        nd.go();
​
        OldDriver od = new OldDriver();
        od.go();
    }
}

运行效果

1560747035458.png

可以看出,模板模式的优势是,模板已经定义了通用架构,使用者只需要关心自己需要实现的功能即可!非常的强大!