Java基础、中级、高级、架构面试资料

模板方法模式在电商项目中的实际使用场景分享

JAVA herman 4863浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

还是那句话,网上有大量的设计模式的文章,他们写的都非常的好,我也能看懂,但是我在实际的项目中用不出来。

你说奇怪不,我会,我懂,但是我不会用。面试回答我都 OK,但是我想在项目中使用,但是就是找不到使用场景!

这样的人不在少数,微信群里有一个人抛出这个问题后,都炸锅了。有同感,请群主指点,所以便有了这篇文章。

模板方法的设计模式非常的简单,类图如下:

模版方法模式的类图

简单吧,确实太简单了。下面我们说一说我们电商系统对模板方法的使用。

我们公司,有非常多的子公司,有线上电商,还有线下实体店。每个公司每个月都要下载一些报表,或者打印合同等之类的需求。公司要求,每次打印合同或者下载报表,表头表尾都要有对应的水印和公司对应的抬头。这里我们就用到了模板方法模式,针对这个使用场景,我们抽象一下,实现代码大致如下:

public abstract class XttblogReport {
    public void print() {
        printTitle();
        printBody();
        printTail();
        printWatermark();
    }
    //打印表头
    public abstract void printTitle();
    //打印正文
    public abstract void printBody();
    //打印表尾
    public abstract void printTail();
    //打印水印
    public abstract void printWatermark();
}

A 公司的实现:

// A 公司报表
public class AReportImpl extends XttblogReport {
     //打印表头
    public void printTitle() {
        System.out.println("打印A表头");
    }
    //打印正文
    public void printBody() {
        System.out.println("打印A正文");
    }
    //打印表尾
    public void printTail() {
        System.out.println("打印A表尾");
    }
    //打印水印
    public void printWatermark() {
        System.out.println("打印A水印");
    }
}

B 公司的报表实现:

// B 公司报表
public class BReportImpl extends XttblogReport {
     //打印表头
    public void printTitle() {
        System.out.println("打印B表头,字体 B,大小 B,图标 B ...... 个性化");
    }
    //打印正文
    public void printBody() {
        System.out.println("打印B个性化正文");
    }
    //打印表尾
    public void printTail() {
        System.out.println("打印B个性化表尾");
    }
    //打印水印
    public void printWatermark() {
        System.out.println("打印B个性化水印");
    }
}

调用实例如下:

public static void main(String[] argv) {
    XttblogReport report = new BReportImpl();
    report.print();
}

简单吧,模版方法非常的简单!

除了我上这个例子,JDK 中也有模板方法的身影,比如:AbstractQueuedSynchronizer、多线程 AQS 的实现。Dubbo 中也有模板方法的使用,比如:Dubbo 中负载均衡算法的实现。SpringBatch 中也有,如果你用过这个框架的话!tomcat 的 LifecycleBase 也是模板方法模式,Spring 中的 JdbcTemplate。

模板模式是一种行为设计模式,它的实现思路是,创建一个桩方法,并且定义一些步骤让子类来实现。模板方法定义了一个算法的执行步骤,或者说能够提供一种默认的实现,这种实现概括一部分子类或者全部子类的共同部分。

总结

  • 模板方法应该是由确定的步骤组成。这些步骤的顺序是固定的。基类与子类之间某些方法或者实现可以有所不同。模板方法应该是 final 的。

  • 大多时候,子类的调用的方法是来自于超类。但是在模板模式中,超类的模板方法调用的方法却来至于子类,这就是著名的Hollywood原则-“don’t call us, we’ll call you”。

  • 基类方法的默认实现被退化为钩子 Hooks 的概念,他们被设计在子类中被重写,如果你期望一些方法在子类中不被重写,你可以让他们为 final。

看吧,模板方法模式是如此的简单,喜欢大家都会用它!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 模板方法模式在电商项目中的实际使用场景分享