• 设计模式学习笔记十三:模板方法模式


    设计模式学习笔记十三:模板方法模式

    介绍

    模板方法(TEMPLATE METHOD)模式,属于类行为型模式,
    意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TEMPLATE METHOD使得子类
    可以不改变一个算法的结构即可重定义该算法的某些特定步骤。(本段摘自《GoF设计模式》 5.10)。
    模板方法有几个要素:

    • 算法骨架:模板执行方法,防止子类更改流程,定义为不可override,即final;
    • 抽象方法:在子类实现的方法;
    • 钩子方法:在模板类中提供默认方法,子类不是必须要实现;

    适用场景

    算法骨架稳定,部分细节需要自定义。

    UML结构图:

    Template

    场景模拟

    侍寝:帝时弄骰而定亦或钦点,内侍背佳丽入房,事毕,问留否。留则罢,不留则去龙元。

    代码实现:

    1.模板类

    /**
     * 模板类
     */
    public abstract class AbstractSleeping {
        final void execute() {
            String concubine = choiceConcubine();
            getConcubine(concubine);
            try {
                doSleep();
            } catch (InterruptedException e) {
                System.out.println("帝偶感风寒……");
            }
            if (wantChildernHook()) {
                doWant();
            }
        }
    
        protected void doWant() {
            System.out.println("帝曰: 留");
        }
    
        protected boolean wantChildernHook() {
            return true;
        }
    
        protected void doSleep() throws InterruptedException {
            // 内涵
            Thread.sleep(10L);
            System.out.println("事毕……");
        }
    
    
        protected void getConcubine(String concubine) {
            System.out.println("内侍背妃子" + concubine + "入房……");
        }
    
        /**
         * 选妃子
         * @return
         */
        protected abstract String choiceConcubine();
    }
    

    2.模板实现类

    /**
     * 翻牌选妃
     */
    public class RandomSleeping extends AbstractSleeping {
        /**
         * 翻牌选妃子
         * @return
         */
        @Override
        protected String choiceConcubine() {
            String[] concubines = new String[] {"娴·乌拉那拉宜修", "沈眉庄", "安陵容", "富察贵人", "方淳意", "余莺儿", "瓜尔佳文鸯", "滟·叶澜依"};
            return concubines[new Random().nextInt(concubines.length)];
        }
    
        /**
         * 帝心难测
         * @return
         */
        protected boolean wantChildernHook() {
            return new Random().nextBoolean();
        }
    }
    
    /**
     * 万千宠爱于一身
     */
    public class SpecialSleeping extends  AbstractSleeping {
        /**
         * 选妃子
         *
         * @return
         */
        @Override
        protected String choiceConcubine() {
            return "甄嬛";
        }
    }
    

    3.Run

    public class Run {
        public static void main(String[] args) {
            new RandomSleeping().execute();
            System.out.println();
            new SpecialSleeping().execute();
        }
    }
    
    

    输出

    内侍背妃子滟·叶澜依入房……
    事毕……
    帝曰: 留
    
    内侍背妃子甄嬛入房……
    事毕……
    帝曰: 留

    策略模式与模板方法模式的区别

    • 策略模式的算法是可以动态指定的,模板方法模式的算法是在模板类完成的,只是其中的变化方法由子类去生成。
    • 策略模式是对象行为型模式,模板方法模式是类行为型模式。
    • 策略模式是接口实现,即组合。模板方式模式是继承实现。OO原则:多用组合,少用继承。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    python数据类型三(字典)
    python数据类型二(列表和元组)
    python数据类型一(重点是字符串的各种操作)
    python基础二
    jquery validate学习心得
    Block 朴实理解
    Block 使用场景
    Block 进阶
    MD5加密
    SQL语句中 chinese_prc_CS_AI_WS 以及replace用法
  • 原文地址:https://www.cnblogs.com/liushijie/p/4712895.html
Copyright © 2020-2023  润新知