走进设计模式的世界8:想看演唱会就要讲规矩-模板方法模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 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号门入场!");
    }
}

如例子所属,模板方法模式可以让父类严格的规定了子类所关注的,这也引出了一种设思路:不要给我打电话我打给你。由超类主导一切,当他们需要的时候会去调用子类。也就是不要给我打电话我会打给你的好莱坞模式。模板方法模式是几乎用的最多的设计模式。所以一定要好好理解和使用。

猜你喜欢

转载自blog.csdn.net/qq_35165632/article/details/83896940