还是那句话,网上有大量的设计模式的文章,他们写的都非常的好,我也能看懂,但是我在实际的项目中用不出来。
你说奇怪不,我会,我懂,但是我不会用。面试回答我都 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。
看吧,模板方法模式是如此的简单,喜欢大家都会用它!
: » 模板方法模式在电商项目中的实际使用场景分享
原创文章,作者:wdmbts,如若转载,请注明出处:https://blog.ytso.com/252001.html