• java设计模式(十六)——模板方法模式


    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+":
    ----------");
            System.out.printf("第一步:备%s 
    ----------
    ",courceName);
        }
    
        @Override
        public void teachCource() {
            System.out.printf("第二步:正在%s教学 
    ----------
    ",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作业 
    ----------
    ",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作业 
    ----------
    ",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、继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改。

  • 相关阅读:
    geoserver发布mysql表数据
    geoserver1
    geoserver
    快速搭建arcgis以及cesium环境
    openlayers和cesium实现地图二三维切换
    记Mysql类型引起的BUG
    OpenLayers 图层(Layers) 详解
    基于TrueLicense实现产品License验证功能
    第七章
    第六周进度报告
  • 原文地址:https://www.cnblogs.com/tdyang/p/13359689.html
Copyright © 2020-2023  润新知