版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35165632/article/details/83896940
模板方法模式:
在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中。模板方法可以使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
设计原则:不要给我打电话,我打给你。
解释:模板方法定义了算法的步骤,把这些步骤延迟到子类。模板方法模式为我们提供了一种代码复用的重要技巧。模板方法的抽象类可以定义具体方法,抽象方法,和钩子。抽象方法由之类实现,具体方法子类不可重写,钩子子类方法根据情况,可以重写。策略模式和模板方法模式都封装了算法。策略模式用组合,模板方法用继承。工厂方法是模板方法的一种特殊版本。
模板方法样例演示:想看演唱会就要讲规矩。
// 演唱会入口的基类(抽象类)
public abstract class Entrance{
final void watchConcert(){
// 买票
buyTicket();
// 检票
checkTicket();
// 入场
entrance();
// 就坐
sit();
// 分发应援物
giving();
// 看演唱会
watch();
}
// 由于不同的观众入场的方式不一样,所以具体的实现延迟到子类。
abstract void entrance();
// 分发应援物(模板方法中的钩子,粉丝会的入场需要重写方法,其他人不需要)
void giving(){
}
// 买票 为公共方法之类不可重写
final void buyTicket(){
System.out.println("购票成功!");
}
// 检票 为公共方法之类不可重写
final void checkTicket(){
System.out.println("检票成功!");
}
// 就坐 为公共方法之类不可重写
final void sit(){
System.out.println("就坐成功!");
}
// 看演唱会 为公共方法之类不可重写
final void watch(){
System.out.println("演唱会开始!");
}
}
// 粉丝协会入场
public class FansEntrance extends Entrance{
// 重写钩子,实现分发应援物。
void giving{
System.out.println("分发应援物成功!");
}
// 实现父类抽象方法
void entrance(){
System.out.println("粉丝协会会员从1号门入场!");
}
}
// 散客入场
public class OtherFansEntrance extends Entrance{
// 不会分发应援物所以不用重写钩子
// 实现父类抽象方法
void entrance(){
System.out.println("散客从2号门入场!");
}
}
如例子所属,模板方法模式可以让父类严格的规定了子类所关注的,这也引出了一种设思路:不要给我打电话我打给你。由超类主导一切,当他们需要的时候会去调用子类。也就是不要给我打电话我会打给你的好莱坞模式。模板方法模式是几乎用的最多的设计模式。所以一定要好好理解和使用。