类型:行为型模式
实现原理:一个抽象类公开定义了执行它的方法的方式/模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行
意图:使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决:一些通用却在每一个子类都重写了的方法造成的冗余
解决方法:将这些通用算法抽象出来。
何时使用:有一些通用的方法。
实现核心:在抽象类实现,其他步骤在子类实现。
应用实例: 盖楼需要地基、水管等
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统膨胀。
使用场景: 1、多个子类共有的逻辑相同的方法 2、重要的、复杂的方法,可以考虑作为模板方法。
实现
步骤 1
创建一个抽象类,它的模板方法被设置为 final。Game.java
public abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();//模板public final void play(){//初始化游戏initialize();//开始游戏startPlay();//结束游戏endPlay();}
}
步骤 2
创建扩展了上述类的实体类。Cricket.java
public class Cricket extends Game {@Overridevoid endPlay() {System.out.println("Cricket Game Finished!");}@Overridevoid initialize() {System.out.println("Cricket Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Cricket Game Started. Enjoy the game!");}
}
Football.java
public class Football extends Game {@Overridevoid endPlay() {System.out.println("Football Game Finished!");}@Overridevoid initialize() {System.out.println("Football Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Football Game Started. Enjoy the game!");}
}
步骤 3
使用 Game 的模板方法 play() 来演示游戏的定义方式。TemplatePatternDemo.java
public class TemplatePatternDemo {public static void main(String[] args) {Game game = new Cricket();game.play();System.out.println();game = new Football();game.play(); }
}
步骤 4
执行程序,输出结果:Cricket Game Initialized! Start playing.
Cricket Game Started. Enjoy the game!
Cricket Game Finished!Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!这段代码演示了模板方法模式。以下是代码的逐步解释:步骤 1:创建一个抽象类Game,其中包含了三个抽象方法initialize()、startPlay()和endPlay(),以及一个被声明为final的模板方法play()。模板方法play()定义了游戏的整体框架,包括初始化游戏、开始游戏和结束游戏的流程。步骤 2:创建两个实体类Cricket和Football,它们分别扩展了Game类并实现了抽象方法。在每个实体类中,重写了initialize()、startPlay()和endPlay()方法来定义具体的游戏行为。步骤 3:使用TemplatePatternDemo类来演示游戏的定义方式。在main()方法中,创建了一个Cricket对象和一个Football对象,并通过调用它们的play()方法来演示游戏的整个流程。步骤 4:执行程序并观察输出。它将显示先后执行的游戏流程,包括初始化游戏、开始游戏和结束游戏的消息。输出结果为:Cricket Game Initialized! Start playing.
Cricket Game Started. Enjoy the game!
Cricket Game Finished!Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!这段代码演示了模板方法模式,它通过定义一个抽象类并在其中封装了一个模板方法,在子类中实现具体行为,从而实现了一种固定的流程。这样可以保持流程统一,同时也允许子类根据需要改变特定步骤的实现。