模板方法模式

定义一个算法骨架(模板),将算法中的某一些步骤对子类开放修改,以此来区别子类。

比如说在部队中可能在一起的有炮兵、汽车兵、步兵等,他们每天都要训练,训练内容射击、跑步是每个兵种每天都要练的,但是还有其它训练是每个兵种自己独有的训练,那么他们一条的训练内容可能如下。

08:00 跑步
10:00 专业训练A

14:00 专业训练B
16:00 射击训练

以上就是部队统一制定的训练框架,那么炮兵的训练可能是

08:00 跑步
10:00 装弹训练A

14:00 防空训练B
16:00 射击训练

模板方法模式可能有以下角色

  • 抽象类:定义统一的方法内容,定义抽象方法用于子类特殊实现,将这些方法组合成一个算法模板(同时里面可能会有一些钩子方法,这些钩子方法实现为空,意思是可以让子类重写进行实现,不重写也可以,这个步骤的有无根据自己需要)。
  • 具体实现类:继承实现抽象类及抽象方法

下面使用一个炒菜的例子来实现模板方法模式

抽象类 - Cook

public abstract class Cook {
    final void template(){
        putOil();
        putMeat();
        putVegetable();
        putSalt();
        putAginomoto();
        plateLoading();
    }
    final void putOil(){
        System.out.println("放油");
    }
    abstract void putMeat();
    abstract void putVegetable();
    final void putSalt(){
        System.out.println("放盐");
    };
    //放味精 - 根据自己喜好
    void putAginomoto(){

    }
    final void plateLoading(){
        System.out.println("装盘");
    }
}

具体实现 - 炒韭菜、炒芹菜

public class CookLeek extends Cook{
    @Override
    void putMeat() {
        System.out.println("放入牛肉");
    }

    @Override
    void putVegetable() {
        System.out.println("放入韭菜");
    }
}
public class CookCelery extends Cook{
    @Override
    void putMeat() {
        System.out.println("放入猪肉");
    }

    @Override
    void putVegetable() {
        System.out.println("放入芹菜");
    }

    @Override
    void putAginomoto() {
        System.out.println("放入味精");
    }
}

测试

public class TemplateTest {
    @Test
    public void test(){
        Cook cook1 = new CookCelery();
        cook1.template();
        System.out.println("===================");
        Cook cook2 = new CookLeek();
        cook2.template();
    }
}
======测试======
放油
放入猪肉
放入芹菜
放盐
放入味精
装盘
===================
放油
放入牛肉
放入韭菜
放盐
装盘

你可能感兴趣的:(模板方法模式)