谈笑间学会模板方法模式

作者: 笑Skr人啊 | 来源:发表于2020-03-20 19:29 被阅读0次

1 背景

某天早上,Skr郎正在一边悠哉的吃着加了三跟烤肠的手抓饼,一边悠闲地逛着论坛,看着沙雕网友的帖子,Skr郎会心一笑,正欲给沙雕帖子点赞,邮件忽的弹出,Skr郎慢悠悠的打开邮件

任务: 每日店铺交易表单导出
时限: 一周
要求如下:
    1. 表头统一格式为Skr-店铺名称(eg:Skr-SM旗舰店)
    2. 内容为店铺当日交易数据
    3. 表尾为当天日期

Skr郎心中暗喜,看我两天搞定,剩下的时间就可以嘿嘿嘿了

2 代码出炉

/**
 * 交易Service
 *
 * @author gp6
 * @date 2020/3/20
 */
public class TradeService {

    /**
     * 交易表单导出
     *
     * @param storeName 店铺名称
     */
    public void exportTradeData(String storeName) {
        System.out.println("表头:Skr-" + storeName);
        System.out.println("交易数据");
        System.out.println("表尾:当天日期");
    }
}


/**
 * 测试模板方法
 *
 * @author gp6
 * @date 2020/3/20
 */
public class TestTemplate {

    public static void main(String[] args) {
        // 1 : 交易表单导出
        TradeService tradeService = new TradeService();
        tradeService.exportTradeData("SM旗舰店");
    }
}

Skr郎看着完成的代码,心中评价道:这段代码,逻辑严谨,注释清晰,优雅中透露着洒脱,洒脱中透露着不羁,完美!

正洋洋自得间,项目经理喊道:Skr郎,你过来一下!Skr郎赶紧屁颠屁颠的跑过去.

项目经理:临时加个需求,把订单列表 也按照前面一样的格式导出来,时间不加.

Skr郎:好的,没问题(MMP)

/**
* 订单Service
*
* @author gp6
* @date 2020/3/20
*/
public class OrderService {

    /**
     * 订单表单导出
     *
     * @param storeName 店铺名称
     */
    public  void exportOrderData(String storeName) {
        System.out.println("表头:Skr-" + storeName);
        System.out.println("订单数据");
        System.out.println("表尾:当天日期");
    }
}


/**
 * 测试模板方法
 *
 * @author gp6
 * @date 2020/3/20
 */
public class TestTemplate {

    public static void main(String[] args) {
        // 1 : 交易表单导出
        TradeService tradeService = new TradeService();
        tradeService.exportTradeData("SM旗舰店");

        // 2 : 订单表单导出
        OrderService orderService = new OrderService();
        orderService.exportOrderData("SM旗舰店");
    }
}

Skr郎看着完成的代码,心中评价道:这段代码,逻辑严谨,注释清晰,优雅中透露着洒脱,洒脱中透露着不羁,虽然没有上一版优雅,但还是比较不错的!

正洋洋自得间,又听项目经理喊道:Skr郎,你过来一下!Skr郎心里想着如果这次加需求不加时间,老子坚决不做!

项目经理:临时在加个需求,把店铺新增粉丝数据 也按照前面一样的格式导出来,时间不加.

Skr郎:好的,没问题(心里问候一下他的族中长辈)

/**
 * 粉丝Service
 *
 * @author gp6
 * @date 2020/3/20
 */
public class FansService {

    /**
     * 新增粉丝表单导出
     *
     * @param storeName 店铺名称
     */
    public void exportAddFansData(String storeName) {
        System.out.println("表头:Skr-" + storeName);
        System.out.println("新增粉丝数据");
        System.out.println("表尾:当天日期");
    }
}


/**
 * 测试模板方法
 *
 * @author gp6
 * @date 2020/3/20
 */
public class TestTemplate {

    public static void main(String[] args) {
        // 1 : 交易表单导出
        TradeService tradeService = new TradeService();
        tradeService.exportTradeData("SM旗舰店");

        // 2 : 订单表单导出
        OrderService orderService = new OrderService();
        orderService.exportOrderData("SM旗舰店");

        // 3 : 新增粉丝表单导出
        FansService fansService = new FansService();
        fansService.exportAddFansData("SM旗舰店");
    }
}

Skr郎看着完成的代码,心中评价道:这段代码,逻辑严谨,注释清晰…我呸,这写的什么鬼东西!看着重复的表头与表尾,Skr郎陷入沉思…

如果后面添加有更多的相同格式导出后,要变更表头与表尾的内容格式,是不是每个类中相关的导出方法都要改动,如忘记修改,是不是导出就会格式不统一

格式不统一,问题还是不大的,但是如果重复的不是表头与表尾,而是涉及金钱交易的逻辑,如果有几处忘记修改,是不是就要直接卷铺盖滚蛋??

要将通用的逻辑抽取出来,咦,这不是典型的模板方法模式吗??

3 模板方法模式

定义:
    定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤

看了模板方法模式的定义,是不是很符合这种场景

定义一个操作中的算法骨架(表头,获取XX数据,表尾),而将算法的一些步骤(获取XX数据)延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤(获取的数据不同)

简直完美,Skr郎沾沾自喜

/**
 * 模板方法的核心(定义一个操作中的算法骨架)
 *
 * @author gp6
 * @date 2020/3/20
 */
public abstract class AbstractTemplate {

    /**
     * 导出数据
     *
     * @param storeName 店铺名称
     */
    public void exportData(String storeName) {
        // 通用逻辑--表头
        header(storeName);

        // 获取不同的数据
        getData();

        // 通用逻辑--表尾
        end();
    }

    /**
     * 表头
     *
     * @param storeName 店铺名称
     */
    private void header(String storeName) {
        System.out.println("表头:Skr-" + storeName);
    }

    /**
     * 表尾
     */
    private void end() {
        System.out.println("当天日期");
    }

    /**
     * 获取数据(算法的一些步骤(获取XX数据)延迟到子类)
     */
    public abstract void getData();
}


/**
 * 交易Service
 *
 * @author gp6
 * @date 2020/3/20
 */
public class TradeService extends AbstractTemplate{

    /**
     * 获取交易数据
     */
    @Override
    public void getData() {
        System.out.println("交易数据");
    }
}

/**
* 订单Service
*
* @author gp6
* @date 2020/3/20
*/
public class OrderService  extends AbstractTemplate{

    /**
     * 获取订单数据
     */
    @Override
    public void getData() {
        System.out.println("订单数据");
    }
}

/**
 * 粉丝Service
 *
 * @author gp6
 * @date 2020/3/20
 */
public class FansService extends AbstractTemplate{

    /**
     * 获取新增粉丝数据
     */
    @Override
    public void getData() {
        System.out.println("新增粉丝数据");
    }
}

/**
 * 测试模板方法
 *
 * @author gp6
 * @date 2020/3/20
 */
public class TestTemplate {

    public static void main(String[] args) {
        // 1 : 交易表单导出
        TradeService tradeService = new TradeService();
        tradeService.exportData("SM旗舰店");

        // 2 : 订单表单导出
        OrderService orderService = new OrderService();
        orderService.exportData("SM旗舰店");

        // 3 : 新增粉丝表单导出
        FansService fansService = new FansService();
        fansService.exportData("SM旗舰店");
    }
}

此时如果要修改表头或表尾内容格式,只需在AbstractTemplate此类中修改即可

Skr郎写到此处,心满意足的点点头,心中评价道:这段代码,逻辑严谨,注释清晰,优雅中透露着洒脱,洒脱中透露着不羁,真是"此码只应天上有,人间难得几回寻!"
呀! 想不到我作诗的功夫也如此深厚,哎,如此完美的男人,别人只能羡慕嫉妒恨!

4 模板方法模式类图

模板方法模式类图

类图中Man/Woman相当于文章中的OrderService/FansService/TradeService

allShop()相当于文章中的exportData()

go()相当于文章中的header()/end()

shop()相当于文章中的exportData()

相关文章

  • 谈笑间学会模板方法模式

    1 背景 某天早上,Skr郎正在一边悠哉的吃着加了三跟烤肠的手抓饼,一边悠闲地逛着论坛,看着沙雕网友的帖子,Skr...

  • 11.8设计模式-模板模式-详解

    设计模式-模式模式 模板方法模式详解 模板方法模式在android中的实际运用 1.模板方法模式详解 2.模板方法...

  • 第5章 -行为型模式-模板方法模式

    一、模板方法模式的简介 二、模板方法模式的优点 三、模板方法模式的应用场景 四、模板方法模式的实例

  • 模板方法模式

    模板方法模式 模板方法模式的定义 模板方法模式(Template Method Pattern)是如此简单,以致让...

  • 设计模式系列-模板方法模式

    JAVA设计模式系列: 单例模式 观察者模式 模板方法模式 模板方法模式 定义 模板方法模式在一个方法中定义了算法...

  • 模板方法模式

    一、模板方法模式介绍 二、模板方法模式代码实例

  • 模板方法模式

    一、概念 二、模板方法模式UML图 三、模板方法模式的2个角色 四、模板方法与基本方法的概念 模板方法: 基本方法...

  • 设计模式 | 模板方法模式及典型应用

    本文的主要内容: 介绍模板方法模式 源码分析模板方法模式的典型应用Servlet 中的模板方法模式Mybatis ...

  • 模板方法及观察者模式

    1、本文主要内容 模板方法定义 模板方法示例 观察者模式 本文主要讲两个设计模式,模板方法以及观察者模式,模板方法...

  • 设计模式之十——模板方法模式

    原文传送门 1 介绍 模板方法模式是类的行为模式。 1.1 什么是模板方法模式 模板方法模式是所有模式中最为常见的...

网友评论

    本文标题:谈笑间学会模板方法模式

    本文链接:https://www.haomeiwen.com/subject/airsyhtx.html