JAVA设计模式——模板方法模式(Template Method Pattern)

概述

模板方法模式属于行为型模式。它由一个抽象类公开定义了执行它的方法的模板(执行的方式或顺序),它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。具体而言就是抽象类定义了某个方法的执行方式或者顺序,但是将该方法中的部分逻辑甚至全部逻辑实现交给具体的子类去实现,实现更高的抽象性。

模式中的角色

1、抽象类(AbstractClass):定义方法的模板,即方法的执行方式和顺序。

2、具体类(ConcreteClass):实现抽象类中的抽象方法,提供具体的执行逻辑。

应用举例

简单来说,比如我们去公司上班,我们将去上班这个行为定义为一个方法——prepareGotoWork()。假设大部分人去上班的步骤都可以分为四个步骤:穿衣服、吃早饭、带上东西和前往公司,但是不同的性别,不通的职工,在做这些具体的步骤的时候肯定采用不同的方式,比如男性和女性穿的衣服可能不同,普通职工和领导需要带的东西也不同,每个人前往公司的方式也不同,我们将这四个步骤分别定义为:dressUp()、eatBreakfast()、takeThings()和gotoCompany()这四个抽象方法,并交给子类去实现。抽象类和具体的实现子类代码如下:

public abstract class AbstractPerson {
    public void prepareGotoWork(){
        dressUp();
        eatBreakfast();
        takeThings();
        gotoCompany();
    }
    protected abstract void dressUp();
    protected abstract void eatBreakfast();
    protected abstract void takeThings();
    protected abstract void gotoCompany();
}
public class FemaleWorker extends AbstractPerson {
    @Override
    protected void dressUp() {
        System.out.println("穿裙子");
    }


    @Override
    protected void eatBreakfast() {
        System.out.println("吃燕麦片");
    }


    @Override
    protected void takeThings() {
        System.out.println("带上化妆包");
    }


    @Override
    protected void gotoCompany() {
        System.out.println("坐公交车");
    }
}
public class MaleWorker extends AbstractPerson {
    @Override
    protected void dressUp() {
        System.out.println("穿T恤衫");
    }


    @Override
    protected void eatBreakfast() {
        System.out.println("吃包子");
    }


    @Override
    protected void takeThings() {
        System.out.println("带上电脑包");
    }


    @Override
    protected void gotoCompany() {
        System.out.println("步行");
    }
}
public class Test {
    public static void main(String[] args) {
        FemaleWorker femaleWorker = new FemaleWorker();
        MaleWorker maleWorker = new MaleWorker();
        femaleWorker.prepareGotoWork();
        maleWorker.prepareGotoWork();
    }
}

JAVA设计模式——模板方法模式(Template Method Pattern)_第1张图片

可以看到FemaleWorker类和MaleWorker类分别对抽象类AbstractPerson类中的方法进行了重写,并采用该类中的方法prepareGotoWork对重写的方法进行调用。

总结

1、模板方法模式将方法中公用的部分逻辑或者代码顺序在父类(超类)中定义好,这样可以避免在具体实现的子类中重复的写同样的代码,就例子中的方法而言,如果公司提供班车服务,那么大家上下班都可以乘坐班车,那此时我们就可以在父类中实现gotoCompany方法,就不需要再在每个子类都重写gotoCompany方法了。

2、不同的子类可以实现不同的细节,提高了算法的扩展性。

3、我们可以在Test中将maleWorker和femaleWorker的声明为AbstractPerson类型,这样可以通过子类的具体实现扩展父类的行为。

你可能感兴趣的:(设计模式,设计模式,java)