个人理解:一个模板抽象类(里面有多个方法和模板方法,在模板方法里调用其他方法),创建多个子类继承抽象类,在子类中重写抽象方法。在实现类里创建模板抽象类,调用子类中的方法>
缺点:子类里不能添加其他功能,只能实现抽象父类里的方法
官方一点的文档 -------------------》》》》》
模板模式
在模板模式(Template Pattern)中,⼀个抽象类公开定义了执⾏它的⽅法的⽅式/模板。它的⼦类可以按需要重写⽅法实现,但调⽤将以抽象类中定义的⽅式进⾏。这种类型的设计模式属于行为型模式。
介绍
意图:定义⼀个操作中的算法的骨架,⽽将⼀些步骤延迟到⼦类中。模板⽅法使得⼦类可以不改变⼀个算法的结构,即可重定义该算法的某些特定步骤。
主要解决:⽅法通⽤,每⼀个⼦类都重新写了这个⽅法。
何时使⽤:有通⽤的⽅法。
如何解决:将这些通⽤方法抽象出来。
关键代码:在抽象父类设计模板。
应用实例:
1.Spring中对Hibernate的⽀持,将⼀些已经定好的⽅法封装起来,⽐如开启事务、获取Session、关闭Session 等,程序员不重复写那些已经规范好的代码,直接丢⼀个实体就可以保存。
优点:
1.封装不变部分,扩展可变部分。
2.提取公共代码,便于维护。
3.行为由⽗类控制,⼦类实现。
缺点:每⼀个不同的实现都需要⼀个⼦类,导致类的个数增加,使得系统更加庞⼤。
使用场景: 多个⼦类有共有的⽅法,且逻辑相同。
注意事项:为防⽌恶意操作(重写模板方法),⼀般模板⽅法加上final关键词。
实现
我们将创建⼀个定义操作的Game抽象类,其中,模板⽅法设置为final,这样它就不会被重写。Csgo和LOL是扩展了Game的实体类,它们重写了抽象类的⽅法。 TemplatePatternDemo,我们的演示类使⽤Game来演示模板模式的⽤法。
具体实现步骤
1.创建⼀个Java项⽬。
2.创建⼀个抽象类Game,它的模板⽅法被设置为final。
package src.com.设计模式.模板模式;
public abstract class Game {
//初始化游戏
public abstract void initialize();
//开始游戏
public abstract void startPlay();
//结束游戏
public abstract void endPlay();
//模板(初始化,开始游戏,结束游戏) final保证play方法不被子类重写
public final void play(){
initialize();
startPlay();
endPlay();
}
}
3.创建扩展了上述类的实体类Csgo。
package src.com.设计模式.模板模式;
public class Csgo extends Game{
@Override
public void initialize() {
System.out.println("Csgo初始化成功");
}
@Override
public void startPlay() {
System.out.println("Csgo正在执行");
}
@Override
public void endPlay() {
System.out.println("Csgo运行结束");
}
}
4.创建扩展了上述类的实体类LOL。
package src.com.设计模式.模板模式;
public class LOL extends Game{
@Override
public void initialize() {
System.out.println("英雄联盟初始化成功");
}
@Override
public void startPlay() {
System.out.println("英雄联盟正在执行");
}
@Override
public void endPlay() {
System.out.println("英雄联盟运行结束");
}
}
5.使⽤Game的模板⽅法play()来演示游戏的定义⽅式。
package src.com.设计模式.模板模式;
public class TemplatePatternDemo {
public static void main(String[] args) {
Game game = new Csgo();
game.play();
System.out.println("--------------");
game = new LOL();
game.play();
}
}
6.执⾏程序,输出结果。