封装算法: 模板方法(Template Method)模式

template method(模板方法)模式是一种行为型设计模式,它在一个方法中定义了算法的骨架(这个方法被称为template method,模板方法),并将算法的具体步骤放到子类中去实现。template method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

需要指出的是,这里所说的template并不是c++中的模板。

适用性

算法的骨架事先已确定,只是算法的某些步骤的具体实现在不同的子类中有所不同

好处

  • 算法的基本骨架已确定,子类可以方便地实现算法的变体
  • 避免代码的重复,算法的步骤已经在父类中定义,子类根据需要只须实现某些步骤即可

应用

template method经常被应用在框架(framework)中,在框架中定义了通用的实现和基础的功能,并为具体的实现预留了“占位符”,框架的使用者只需要重新定义这些“占位符”即可。

实现

封装算法: 模板方法(Template Method)模式_第1张图片

首先我们定义一个抽象类Game。
在Game类中定义了一个声明为final的template method: play()。
play()方法包含了三个方法的调用,分别为initialize(),startPlay(),endPlay(),这三个方法都声明为abstract类型,表明在子类中需要具体实现这些方法。

Game.java

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();

   // template method
   public final void play(){

      // initialize the game
      initialize();

      // start game
      startPlay();

      // end game
      endPlay();
   }
}

接着,我们定义了Basketball和Football类,它们都是Game的子类,并重写了其中的initialize(),startPlay(),endPlay()方法。

Basketball.java

public class Basketball extends Game {

   @Override
   void endPlay() {
      System.out.println("Basketball Game Finished!");
   }

   @Override
   void initialize() {
      System.out.println("Basketball Game Initialized! Start playing.");
   }

   @Override
   void startPlay() {
      System.out.println("Basketball Game Started. Enjoy the game!");
   }
}

Football.java

public class Football extends Game {

   @Override
   void endPlay() {
      System.out.println("Football Game Finished!");
   }

   @Override
   void initialize() {
      System.out.println("Football Game Initialized! Start playing.");
   }

   @Override
   void startPlay() {
      System.out.println("Football Game Started. Enjoy the game!");
   }
}

最后,我们编写测试类,如下:

TemplatePatternDemo.java

public class TemplatePatternDemo {
   public static void main(String[] args) {

      Game game = new Basketball();
      game.play();
      System.out.println();
      game = new Football();
      game.play();      
   }
}

程序的输出如下:

Basketball Game Initialized! Start playing.
Basketball Game Started. Enjoy the game!
Basketball Game Finished!

Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!

参考资料

  1. https://en.wikipedia.org/wiki/Template_method_pattern
  2. http://www.javacodegeeks.com/2013/03/template-method-design-pattern-in-java.html
  3. http://www.tutorialspoint.com/design_pattern/template_pattern.htm

你可能感兴趣的:(设计模式,template,method,模板方法,封装算法)