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

2022-05-24  本文已影响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定义了健身的流程,至于运动前的具体活动、进入正式锻炼、运动后的活动则放在了子类实现。上面便是模板模式的简单实现。

最后总结

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

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

上一篇下一篇

猜你喜欢

热点阅读