美文网首页
模板模式,也是解耦算法的吗?

模板模式,也是解耦算法的吗?

作者: 程就人生 | 来源:发表于2022-05-24 11:53 被阅读0次

    模板模式,和算法有什么关系呢?

    模板模式,在什么场景使用呢?


    模板模式(Template Pattern),定义一个算法的骨架,把算法中的变与不变分离开来,封装不变的部分,扩展变的部分,又称模板方法模式。它是一种行为型模式。

    业务场景:一次性实现一个算法不变的部分,并将可变的行为留给子类实现。

    关键代码:在抽象类里,使用final修饰算法中不变的部分;可变的部分由子类重写。

    下面看UML类图:


    类图说明:图中有三个类,运动抽象类AbstractExercise,和两个继承者跑步类Run、游泳类Swim,它们不变的部分是运动exercise方法,运动之前的活动beforeExercise方法,运动之后的活动afterExercise方法,具体的运动doExercise方法。变化的是跑步类、游泳类中的具体的运动前、运动中、运动后的具体实现。类图中只有一种关系:继承。

    下面看代码实现:

    1.运动抽象类;

    /**
     * 1.运动抽象类
     * @author 程就人生
     * @Date
     */
    public abstract class AbstractExercise {
      
      /**
       * 模板/模板方法
       */
      public final void exercise(){
        // 运动前的拉伸活动
        beforeExercise();
        // 进入锻炼
        enterExercise();
        // 运动后的拉伸
        afterExercise();    
      }
    
      /**
       * 热身
       */
      abstract void beforeExercise();
      
      /**
       * 进入锻炼
       */
      abstract void enterExercise();
      
      /**
       * 拉伸
       */
      abstract void afterExercise();
      
    }
    

    2.抽象类的继承者;

    /**
     * 2.1 跑步类
     * @author 程就人生
     * @Date
     */
    public class Run extends AbstractExercise{
    
      @Override
      void beforeExercise() {
        System.out.println("跑步前的热身运动...");
      }
    
      @Override
      void enterExercise() {
        System.out.println("跑步中...");
      }
    
      @Override
      void afterExercise() {
        System.out.println("跑步后的拉伸运动...");
      }
    }
    
    /**
     * 2.2 游泳类
     * @author 程就人生
     * @Date
     */
    public class Swim extends AbstractExercise{
    
      @Override
      void beforeExercise() {
        System.out.println("游泳前的热身运动...");
      }
    
      @Override
      void enterExercise() {
        System.out.println("游泳中...");
      }
    
      @Override
      void afterExercise() {
        System.out.println("游泳后的拉伸运动...");
      }
    
    }
    

    3.测试代码;

    public static void main(String[] argo){
        // 跑步
        AbstractExercise run = new Run();
        run.exercise();
        System.out.println();
        // 游泳
        AbstractExercise swim = new Swim();
        swim.exercise();
      }
    

    运行结果:

    跑步前的热身运动...
    跑步中...
    跑步后的拉伸运动...
    
    游泳前的热身运动...
    游泳中...
    游泳后的拉伸运动...
    

    代码说明:去过健身房的伙伴们都知道,无论哪种健身,健身流程都是一样的,运行前先热身,然后进入正式的运动,运动过后再拉伸。抽象运动类AbstractExercise定义了健身的流程,至于运动前的具体活动、进入正式锻炼、运动后的活动则放在了子类实现。上面便是模板模式的简单实现。

    最后总结

    模板模式,它是一个和算法有关系的设计模式。它使用抽象类锁定算法流程,其子类负责具体实现,和其他设计模式还是有很大区别的。

    思考题:你现在还能想起几个和算法有关的设计模式?在项目中有没有模板模式使用的业务场景呢?你又是如何处理的呢?还有优化空间吗?

    相关文章

      网友评论

          本文标题:模板模式,也是解耦算法的吗?

          本文链接:https://www.haomeiwen.com/subject/kgkburtx.html