首页 > 技术文章 > java设计模式(十六)——模板方法模式

tdyang 2020-07-21 23:45 原文

1、基本概念

模板方法模式( Template Method Pattern )又叫模板方法模式,是指定义一个操作中的算法的框
架,而将一些步骤延迟到子类中。使得子类可以不改变-个算法的结构即可重定义该算法的某些特定步
骤,属于行为型设计模式。

生活中也有很多的案例:例如老师的教学:备课-上课-批改作业;做饭:开火-炒菜-关火;上班:打卡-工作-午休-下班

2、类图和角色

类图:

 

 主要角色:

抽象模板:定义一套标准的流程

具体实现:对某些流程的具体实现

 

3、案例

老师的备课模板:备课——上课——批改作业

类图:

 

 抽象模板:AbstractCourceTemplate,定义了备课的一套流程,并设置了钩子函数,只有当布置了作业才去批改作业

有子类的决定是否需要布置作业

public abstract class AbstractCourceTemplate implements ICource{

    protected  String courceName;

    public AbstractCourceTemplate(String courceName){
        this.courceName = courceName;
    }

    //创建课程,final修饰避免子类修改
    public final void cource(){
        preCource();
        teachCource();
        //判断是否布置了作业
        if(!isArrangeHomework()){
            System.out.println("没有布置作业!!!");
        }else{
            doHomework();
        }
    }
    @Override
    public void preCource() {
        System.out.println(courceName+":\n----------");
        System.out.printf("第一步:备%s \n----------\n",courceName);
    }

    @Override
    public void teachCource() {
        System.out.printf("第二步:正在%s教学 \n----------\n",courceName);
    }

    @Override
    public abstract void doHomework();

    //钩子函数
    public abstract boolean isArrangeHomework();
}

具体实现:EnglishCource 

public class EnglishCource extends AbstractCourceTemplate {

    public EnglishCource(String courceName) {
        super(courceName);
    }

    @Override
    public void doHomework() {
        System.out.printf("第三步:检查%s作业 \n----------\n",super.courceName);
    }

    @Override
    public boolean isArrangeHomework() {
        //没有布置作业
        return false;
    }
}

具体实现:MathCource 

public class MathCource extends AbstractCourceTemplate {

    public MathCource(String courceName) {
        super(courceName);
    }

    @Override
    public void doHomework() {
        System.out.printf("第三步:检查%s作业 \n----------\n",super.courceName);
        award();
    }


    public void award(){
        System.out.println("这份作业写得太棒了,奖励他五毛");
    }
    @Override
    public boolean isArrangeHomework() {
        //布置了作业
        return true;
    }
}

测试:

public class Test {
    public static void main(String[] args) {
        AbstractCourceTemplate cource = new MathCource("数学课");
        cource.cource();
    }
}

输出;

数学课:
----------
第一步:备数学课 
----------
第二步:正在数学课教学 
----------
第三步:检查数学课作业 
----------
这份作业写得太棒了,奖励他五毛
英语课:
----------
第一步:备英语课 
----------
第二步:正在英语课教学 
----------
没有布置作业!!!

 

4、优缺点

优点:
1、利用模板方法将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。
2、将不同的代码不同的子类中,通过对子类的扩展增加新的行为,提高代码的扩展性。
3、把不变的行为写在父类上,去除子类的重复代码,提供了一一个很好的代码复用平台,符合开闭原则。
缺点:
1、继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改。

 

推荐阅读