一分钟学会《模板方法模式》

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

在上一篇有读者说,一分钟就看完门面模式了,所以今天的标题就取《一分钟学会模板方法模式》

回顾前面所写过的设计模式

无论是面试还是个人的提升,设计模式是必学的。今天来讲解模板方法模式~

一、模板方法模式 1.1模板方法模式现实例子

大家都知道,我每次写原创技术文章,开头总会有“只有光头才能变强”。我当然不可能每次写文章的时候都去复制这句话(因为这样太麻烦了)。

我有自己的写作模板,给大家看一下:

我的写作模板

前言和最后都是固定下来的,至于第一点和第二点就得看是写什么文章,写不同的文章对应的内容也是不一样的。

每次我写文章的时候,只要在这个模板上添加我自己想写的东西就好了,就不用每次都复制一遍相同的内容,这样就大大减少我的工作量啦。

1.2回到代码世界

代码来源于生活,同样地我可以将我写文章的过程用代码来描述,大家来看一下。

3y每篇文章都会有“前言”和“最后”的内容,3y把这两个模块写出来了。

// 3y的文章模板 public class Java3yWriteArticle { // 前言 public void introduction() { System.out.println("只有光头才能变强"); } // 最后 public void theLast() { System.out.println("关注我的公众号:Java3y"); } }

3y写文章的时候,3y可能就会这样使用:

// 3y写文章 public static void main(String[] args) { Java3yWriteArticle writeArticle = new Java3yWriteArticle(); // 前言 writeArticle.introduction(); // 实际内容 System.out.println("大家好,我是3y,今天来给大家分享我写的模板方法模式"); // 最后 writeArticle.theLast(); }

这样是可以完成3y写文章的功能,但是这样做好吗?这时候3y女朋友也想写文章,她的文章同样也想有“前言”和“最后”两个模块,所以3y女朋友的文章模板是这样的:

// 3y女朋友的文章模板 public class Java3yGFWriteArticle { // 前言 public void introduction() { System.out.println("balabalabalalabalablablalab"); } // 最后 public void theLast() { System.out.println("balabalabalalabalablablalab"); } }

那3y女朋友写文章的时候,可能也会这样使用:

// 3y女朋友写文章 public static void main(String[] args) { Java3yGFWriteArticle java3yGFWriteArticle = new Java3yGFWriteArticle(); // 前言 java3yGFWriteArticle.introduction(); // 实际内容 System.out.println("3y是傻子,不用管他"); // 最后 java3yGFWriteArticle.theLast(); }

可以发现3y和3y女朋友要写文章的时是要重复调用introduction();和theLast();。并且,3y的文章模板和3y女朋友的文章模板中的“前言”和“最后”只是实现内容的不同,却定义了两次,明显就是重复的代码。面对重复的代码我们会做什么?很简单,抽取出来!

于是我们就可以抽取出一个通用的WriteArticle(为了方便调用,我们还将写文章的步骤封装成一个方法):

// 通用模板 public abstract class WriteArticle { // 每个人的“前言”都不一样,所以抽象(abstract) protected abstract void introduction(); // 每个人的“最后”都不一样,所以抽象(abstract) protected abstract void theLast(); // 实际要写的内容,每个人的“实际内容”都不一样,所以抽象(abstract) protected abstract void actualContent(); // 写一篇完整的文章(为了方便调用,我们将这几个步骤分装成一个方法) public final void writeAnCompleteArticle() { // 前言 introduction(); // 实际内容 actualContent(); // 最后 theLast(); } }

所以,3y的模板就可以继承通用模板,在通用模板上实现自己想要的就好了:

// 3y的文章模板 public class Java3yWriteArticle extends WriteArticle { // 前言 @Override public void introduction() { System.out.println("只有光头才能变强"); } // 最后 @Override public void theLast() { System.out.println("关注我的公众号:Java3y"); } @Override protected void actualContent() { System.out.println("大家好,我是3y,今天来给大家分享我写的模板方法模式"); } }

同样地,3y女朋友的文章模板也是类似的:

// 3y女朋友的文章模板 public class Java3yGFWriteArticle extends WriteArticle { // 前言 @Override public void introduction() { System.out.println("balabalabalalabalablablalab"); } // 最后 @Override public void theLast() { System.out.println("balabalabalalabalablablalab"); } @Override protected void actualContent() { System.out.println("3y是傻子,不用管他"); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzgzp.html