Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure. 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 -----------------------------------------------------------------深入浅出的设计模式
主要解决 当完成一个操作具有固定的流程时,由抽象固定流程步骤,具体步骤交给子类进行具体实现(固定的流程,不同的实现)。
优点
缺点
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同的时候,我们通常要考虑用模板方法模式解决。
注意事项: 为防止恶意操作,一般模板方法都加上 final 关键词。
首先来看下 模板方法模式 的通用 UML 类图:
模板方法模式 从 UML 类图中,我们可以看到,模板方法模式 主要包含两种角色:
抽象模板(AbstractClass): 抽象模板类,定义了一套算法框架/流程; 具体实现(ConcreteClass): 具体实现类,对算法框架/流程的某些步骤进行了实现;
当然这只是书面上的定义,用起来你会发现,为什么变得很复杂,好像更难了一样,你也有很多疑问?
最后,设计模式给出的是一种设计框架,而不是条条框框,你需要用的是他真正优秀的地方!
就一杯下午茶,我到底和咖啡还是喝茶,喝咖啡,瑞幸还是星巴克?:
抽象类:
abstract class AbstractClass {
protected void Boil_water() {
System.out.println("SpecificMethod:烧水,倒一杯热水");
/*
* 模板方法的抽象类中,也是可以定义具体方法的,
* 一般子类中都具备或大部分中都具备时,放到抽象父类中。
*/
}
// 需要子类必须实现的需要写成抽象类
protected abstract void Abstract_step1();
protected abstract void Abstract_step2();
protected void Drink() {
System.out.println("SpecificMethod:吹一吹再喝,别烫着!");
}
// 声明为final方法,避免子类覆写
public final void After_Tea() {//来一杯下午茶吧
this.Boil_water();
this.Abstract_step1();
this.Abstract_step2();
this.Drink();
}
}
我要喝咖啡
class Concrete_Cof extends AbstractClass {
@Override
// 具体实现,重写父类抽象方法
protected void Abstract_step1() {
System.out.println("把咖啡豆磨好,倒进杯子里");
}
@Override
protected void Abstract_step2() {
System.out.println("加入方糖和奶精");
}
}
我要喝茶
class Concrete_Tea extends AbstractClass {
@Override
protected void Abstract_step1() {
System.out.println("把茶饼分开,放进杯子里");
}
@Override
protected void Abstract_step2() {
//Do nothing
//可以写成这种什么都没有的,毕竟喝茶我什么都不加(手动狗头)
}
}
我要喝奶茶
public class Concrete_MilkTea extends AbstractClass {
protected void Boil_water() {
System.out.println("煮一杯热牛奶");
}
@Override
protected void Abstract_step1() {
System.out.println("把茶饼分开,放进杯子里,过滤");
}
@Override
protected void Abstract_step2() {
System.out.println("加入方糖和香精");
}
}
class Client {
public static void main(String[] args) {
AbstractClass abc = new Concrete_Cof();
abc.After_Tea();
System.out.println("----------Next day-------------");
abc=new Concrete_Tea();
abc.After_Tea();
System.out.println("----------Next day-------------");
abc=new Concrete_MilkTea();
abc.After_Tea();
}
}
运行结果:
码字这么卖力,麻烦点个赞,点个关注,谢谢。
写在最后: 我叫风骨散人,名字的意思是我多想可以不低头的自由生活,可现实却不是这样。家境贫寒,总得向这个世界低头,所以我一直在奋斗,想改变我的命运给亲人好的生活,希望同样被生活绑架的你可以通过自己的努力改变现状,深知成年人的世界里没有容易二字。目前是一名在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你! 如果有什么想看的,可以私信我,如果在能力范围内,我会发布相应的博文! 感谢大家的阅读!?你的点赞、收藏、关注是对我最大的鼓励!