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

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

介绍

模板方法(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原则:多用组合,少用继承。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值