【行为型模式】模板方法模式template method

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 【行为型模式】模板方法模式template method,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

基本要点

1、核心
处理步骤父类中定义好,具体步骤延迟到子类中定义

2、介绍
模板方法定义了一个操作中的算法骨架,将某些步骤延迟到子类中去定义,这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤

3、举例
我们请客去吃饭,大概流程就是取号—–点菜——买单
但是点菜这个环节我们要等拿到菜单才能决定具体要点什么,所以我们先定义一个点菜的操作,等到了饭馆再决定点烧烤还是点火锅

4、开发中常用场景
实现一个算法,如果存在整体步骤比较固定,某些部分易变,那我们就可以把易变部分抽象出来,供子类实现
例如Junit单元测试、数据库访问的封装(是访问Oracle还是Mysql)、servlet中关于doGet、doPost方法的调用

代码样例

我们举一个去银行办理业务的例子,我们可以去取钱,也可以去存钱
但是我们的大体流程都是:取号——办业务——评分
所以我们可以把办业务这个方法定义成钩子方法

public abstract class BankTemplate {
    public void takeNumber() {
        System.out.println("取号排队");
    }

    public abstract void transact();

    public void evaluate() {
        System.out.println("服务打分");
    }

    // 模板方法,把基本操作组合到一起,定义为final,子类无法重写
    public final void process() {
        this.takeNumber();

        // 钩子方法,执行时,挂在哪个子类下就调用哪个方法
        this.transact();

        this.evaluate();
    }
}

然后我们想要办理哪种业务,直接指向子类对象,实现该钩子方法即可

public class Client {
    public static void main(String[] args) {
        BankTemplate saveMoney = new SaveMoney();
        saveMoney.process();

        // 也可以通过匿名内部类来进行调用
        BankTemplate takeMoney = new BankTemplate() {
            @Override
            public void transact() {
                System.out.println("我要取钱!!");
            }
        };

        takeMoney.process();
    }
}

class SaveMoney extends BankTemplate {
    @Override
    public void transact() {
        System.out.println("我要存钱!!");
    }
}

实现结果如下
在这里插入图片描述

如有错误,欢迎指正

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136804.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!