这两天特别忙,有两位大神在这周结婚,我忙着去蹭吃蹭喝!
没毛病,群主就是个吃货!所以就索性把之前写的设计模式拿出来一篇,分享给大家!
还是那句话,网上有大量的设计模式的文章,他们写的都非常的好,我也能看懂,但是我在实际的项目中用不出来。
你说奇怪不,我会,我懂,但是我不会用。面试回答我都 OK,但是我想在项目中使用,但是就是找不到使用场景!
这样的人不在少数,微信群里有一个人抛出这个问题后,都炸锅了。有同感,请群主指点,所以便有了这篇文章。
模板方法的设计模式非常的简单,类图如下:
简单吧,确实太简单了。下面我们说一说我们电商系统对模板方法的使用。
我们公司,有非常多的子公司,有线上电商,还有线下实体店。每个公司每个月都要下载一些报表,或者打印合同等之类的需求。公司要求,每次打印合同或者下载报表,表头表尾都要有对应的水印和公司对应的抬头。这里我们就用到了模板方法模式,针对这个使用场景,我们抽象一下,实现代码大致如下:
A 公司的实现:
B 公司的报表实现:
调用实例如下:
简单吧,模版方法非常的简单!
除了我上这个例子,JDK 中也有模板方法的身影,比如:AbstractQueuedSynchronizer、多线程 AQS 的实现。Dubbo 中也有模板方法的使用,比如:Dubbo 中负载均衡算法的实现。SpringBatch 中也有,如果你用过这个框架的话!tomcat 的 LifecycleBase 也是模板方法模式,Spring 中的 JdbcTemplate。
模板模式是一种行为设计模式,它的实现思路是,创建一个桩方法,并且定义一些步骤让子类来实现。模板方法定义了一个算法的执行步骤,或者说能够提供一种默认的实现,这种实现概括一部分子类或者全部子类的共同部分。
模板方法应该是由确定的步骤组成。这些步骤的顺序是固定的。基类与子类之间某些方法或者实现可以有所不同。模板方法应该是 final 的。
大多时候,子类的调用的方法是来自于超类。但是在模板模式中,超类的模板方法调用的方法却来至于子类,这就是著名的Hollywood原则-“don’t call us, we’ll call you”。
基类方法的默认实现被退化为钩子 Hooks 的概念,他们被设计在子类中被重写,如果你期望一些方法在子类中不被重写,你可Ц����,Ц����以让他们为 final。
看吧,模板方法模式是如此的简单,喜欢大家都会用它!