模板方法模式是一种行为模式,建议在超类中更一般地定义算法。 该算法是在称为模板方法的方法中定义的。 子类仅定义更具体的算法步骤的实现。
使用这种设计模式的好处是,算法后面的任何更改只会影响超类中的代码。 此外,它还可以提高代码的可重用性。
在本快速教程中,我们将学习在Java中实现模板方法模式。
模板方法模式:
假设我们必须写一篇文章。 通常涉及几个步骤:
- 专题研究
- 勾勒轮廓
- 写介绍
- 然后,准备论文的正文
- 最后,总结一下
因此,让我们继续创建EssayTemplate类:
public abstract class EssayTemplate {
private String topic;
public EssayTemplate(String topic) {
this.topic = topic;
}
public final void writeEssay() {
doResearch();
makeOutline();
writeIntro();
writeBody();
writeConclusion();
}
void doResearch() { System.out.println("Researching"); }
void makeOutline() { System.out.println("Making an outline"); }
void writeIntro() { System.out.println("Introducing topic"); }
void writeConclusion() { System.out.println("Concluding topic");}
abstract writeBody();
}
无论论文的类型是短还是长,大部分的常规步骤(包括研究,创建大纲,撰写引言和结论)都将保持不变。 因此,这些方法定义存在于超类本身中。
另外,请注意, 我们已将模板方法标记为最终方法,以避免被任何子类覆盖。
使用模板类:
论文的主要内容或正文取决于论文的性质。 因此,我们将writeBody()方法定义留给子类提供。
现在,让我们创建EssayTemplate的两个子类-ShortEssay和LongEssay :
public class ShortEssay extends EssayTemplate {
public ShortEssay(String topic) {
super(topic);
}
@Override
public void writeBody() {
System.out.println("Adding 2 paras");
}
}
public class LongEssay extends EssayTemplate {
public LongEssay(String topic) {
super(topic);
}
@Override
public void writeBody() {
System.out.println("Adding 6 paras");
}
}
UML图:
我们可以通过UML图将模板模式的上述示例实现表示为:
![](https://i-blog.csdnimg.cn/blog_migrate/90cda26ec3ebc470d7b80bff34435ca3.png)
ShortEssay和LongEssay定义了writeBody()方法的实现。 但是,定义算法的方法以及其他常见方法的实现位于超类中。
使用模板模式的客户端代码:
让我们编写一些客户端代码来测试我们的实现:
//code in main method
EssayTemplate shortEssay = new ShortEssay("Programming - An Art");
shortEssay.writeEssay();
这样,我们将在控制台上获得以下输出:
Researching
Making an outline
Introducing topic
Adding 2 paras
Concluding topic
结论:
在本教程中,我们研究了模板方法模式。
java.io.InputStream和java.io.OutputStream的所有非抽象方法都使用模板模式 。
翻译自: https://www.javacodegeeks.com/2019/09/template-method-pattern-java.html