亲宝软件园·资讯

展开

设计模式 - 模板方法模式详解及其在Spring中的应用

农夫三拳有点疼~ 人气:1

基本介绍

模板方法模式(Template Method Pattern)也叫模板模式,它在一个抽象类中公开定义了执行它的方法的模板,它的字类可以按需重写方法实现,但调用将以抽象类中定义的方式进行。

简单来说,模板方法模式定义一个操作中的算法的骨架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就能重新定义该算法的某些特定步骤

模式结构

  • AbstractClass:抽象类,类中实现了模板方法,定义了算法的骨架

  • ConcreteClass:实现类,继承抽象类,重写其中的抽象方法

举例说明

编写一个制作豆浆的程序

制作豆浆的流程:选材(黄豆) → 添加配料 → 浸泡 → 磨豆浆

要求:通过添加不同的配料,可以制作出不同口味的豆浆(除了添加配料不同,其它步骤是相同的)

1、定义一个抽象类,BaseSoyMilk:豆浆类

public abstract class BaseSoyMilk {
    /**
     * 模板方法,制作豆浆的流程
     * 声明为 final,防止子类重写
     */
    protected final void make() {
        select();
        addOther();
        soak();
        grind();
    }

    private void select() {
        System.out.println("选择上好的黄豆");
    }

    protected abstract void addOther();

    private void soak() {
        System.out.println("浸泡原材料");
    }

    private void grind() {
        System.out.println("研磨成豆浆");
    }
}

2、创建子类,PeanutSoyMilk:花生豆浆

public class PeanutSoyMilk extends BaseSoyMilk {
    @Override
    protected void addOther() {
        System.out.println("添加花生");
    }
}

RedBeanSoyMilk:红豆豆浆

public class RedBeanSoyMilk extends BaseSoyMilk {
    @Override
    protected void addOther() {
        System.out.println("添加红豆");
    }
}

3、创建测试类:Client

public class Client {
    @Test
    public void test() {
        BaseSoyMilk peanutSoyMilk = new PeanutSoyMilk();
        peanutSoyMilk.make();
        System.out.println("****************");
        BaseSoyMilk redBeanSoyMilk = new RedBeanSoyMilk();
        redBeanSoyMilk.make();
    }
}

4、运行结果

选择上好的黄豆
添加花生
浸泡原材料
研磨成豆浆
************
选择上好的黄豆
添加红豆
浸泡原材料
研磨成豆浆

钩子方法

在模板方法模式的抽象类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况来决定是否重写它,该方法称为「钩子」。

依然以上面制作豆浆的例子来说明,如果我们什么配料都不想加,制作纯豆浆,可以使用钩子方法对其改造。

1、为 BaseSoyMilk 类添加一个方法 isAdd 判断是否添加其它材料

public abstract class BaseSoyMilk {
    /**
     * 模板方法,制作豆浆的流程
     * 声明为 final,防止子类重写
     */
    protected final void make() {
        select();
        if(isAdd()){
            addOther();
        }
        soak();
        grind();
    }

    private void select() {
        System.out.println("选择上好的黄豆");
    }

    protected abstract void addOther();

    private void soak() {
        System.out.println("浸泡原材料");
    }

    private void grind() {
        System.out.println("研磨成豆浆");
    }

    protected boolean isAdd(){
        return true;
    }
}

2、创建一个子类 PureSoyMilk:纯豆浆

public class PureSoyMilk extends BaseSoyMilk {
    @Override
    protected void addOther() {
    }

    @Override
    protected boolean isAdd() {
        return false;
    }
}

3、测试

@Test
public void test2() {
    BaseSoyMilk pureSoyMilk = new PureSoyMilk();
    pureSoyMilk.make();
}

4、运行结果(现在就没有添加其它材料的步骤了)

选择上好的黄豆
浸泡原材料
研磨成豆浆

模式分析

加载全部内容

相关教程
猜你喜欢
用户评论