设计模式之模板模式

  1. 定义:定义了一个操作算法骨架,在这个骨架中定义了一些方法,将其中的一些方法延迟到子类中去实现,使得子类在不改变一个算法框架的同时,重新定义该算法的某些特定步骤
  2. 大白话就是:抽象父类看做模板,在抽象父类中第一个模板方法,这个方法是只能被继承,不能被子类做任何的修改,在模板方法里面调用一些算法步骤(解释:这个类用来做一些事情的,做事情就要有步骤,模板方法相当于一个大纲,大纲里面有操作步骤),这些算法步骤基本上都是高度抽象出来的,有专门的作用,例如开发人员的编程操作,代码到最后都要提交到远程,就像这个提交操作,所有人都要做一样。但是这些操作有的地方可以不一样,向前端和后台的编写代码肯定不一样,这些式的方法在模板类中被定义为抽象方法,用来让子类自定义操作内容,就这样相同中带着不同
  3. 举例
    后台、前台:
    产品提需求
    程序员选择编程语言
    程序员选择编程工具
    编写完成后提交代码
    审核上线
    你是优秀程序员
    这些操作是一个模板,其中可以简单的看,编程语言可以不同,编程工具可以不同,但是产品提需求,编写后提交代码,审核上线,你是优秀程序员都是模板化操作,接下来编写模板类,如下所示
    抽象基类
package com.fgy.template;

public abstract class ProgrammingTemplate {

    public final void programming() {

        //给定需求(不需要自定义操作)
        givenRequirements();
        //选择编程语言(需要)
        selectProgrammingLanguage();

        //选择编程工具(需要)
        selectProgrammingTools();

        //提交代码(不需要)
        commitCode();

        //上线审核(不需要)
        onLineAudit();

        //你是优秀的程序员(不需要)
        youAreGood();

    }

    private void youAreGood() {
        System.out.println("你是优秀的程序员");
    }

    private void onLineAudit() {
        System.out.println("领导上线进行审核");
    }

    private void commitCode() {
        System.out.println("程序员提交代码");
    }

    //抽象方法,延迟到子类中实现
    protected abstract void selectProgrammingTools();

    //抽象方法,延迟到子类中实现
    protected abstract void selectProgrammingLanguage();

    private void givenRequirements() {
        System.out.println("产品给定需求!!!!");
    }

}

两个实现子类

package com.fgy.template;

public class BackEndProgrammer extends ProgrammingTemplate {

    @Override
    protected void selectProgrammingTools() {
        System.out.println("开发用Eclipse!!!!");
    }

    @Override
    protected void selectProgrammingLanguage() {

        System.out.println("编程语言选择Java语言");
    }
}
package com.fgy.template;

public class FrontEndDeveloper extends ProgrammingTemplate {

    @Override
    protected void selectProgrammingTools() {
        System.out.println("开发工具选择IDEA!!!!!");
    }

    @Override
    protected void selectProgrammingLanguage() {
        System.out.println("编程语言选择OC!!!!");
    }

}

测试类

package com.fgy.template;

public class TextTemplate {

    public static void main(String[] args) {
        ProgrammingTemplate programmer = new BackEndProgrammer();
        programmer.programming();
        System.out.println("**********************************\n");
        ProgrammingTemplate programmer2 = new FrontEndDeveloper();
        programmer2.programming();
    }

}

测试结果
这里写图片描述

但是在开发过程中,有时候我们不想让模板中的固定不变的操作步骤出现,那我们怎么做?我们采用钩子方法,在模板中提供一个方法,让子类决定那些步骤不出现,这就是所谓的挂钩
在以上的模板类中的如下操作

 if (isSuccess()) {
    //你是优秀的程序员(不需要)
    youAreGood();            
  }
    protected boolean isSuccess() {
        return true;
    }

这个函数可以被子类继承,子类来决定 youAreGood(); 这个步骤是否可用
两个子类现在的代码如下:

package com.fgy.template;

public class BackEndProgrammer extends ProgrammingTemplate {

    @Override
    protected void selectProgrammingTools() {
        System.out.println("开发用Eclipse!!!!");
    }

    @Override
    protected void selectProgrammingLanguage() {

        System.out.println("编程语言选择Java语言");
    }

    @Override
    protected boolean isSuccess() {
        return false;
    }
}
package com.fgy.template;

public class FrontEndDeveloper extends ProgrammingTemplate {

    @Override
    protected void selectProgrammingTools() {
        System.out.println("开发工具选择IDEA!!!!!");
    }

    @Override
    protected void selectProgrammingLanguage() {
        System.out.println("编程语言选择OC!!!!");
    }

    @Override
    protected boolean isSuccess() {
        return true;
    }
}

效果如下
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值