设计模式(二十一):模板模式

152 阅读1分钟

介绍

模板模式(Template Pattern)属于行为型模式。一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

优点

  • 封装不变部分,扩展可变部分
  • 提取公共代码,便于维护
  • 行为由父类控制,子类实现。

缺点

  • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大

应用

在方法(通常是父类方法)中定义算法的骨架,将其中的一些步骤延迟到子类实现,这样可以在不改变算法结构的情况下,重新定义某些步骤。这些步骤可以是抽象的(表示子类必须实现),也可以不是抽象的(表示子类可选实现,这种方式叫钩子)

就比如基类BaseActivity、事件分发机制、onDraw等等

实现

关键代码:实现同一个接口

abstract class Game {
    abstract void initialize();
    abstract void startPlay();
    abstract void endPlay();
  
    //模板
    public final void play(){
  
       //初始化游戏
       initialize();
  
       //开始游戏
       startPlay();
  
       //结束游戏
       endPlay();
    }
 }

 class Cricket extends Game {
 
    @Override
    void endPlay() {
       System.out.println("Cricket Game Finished!");
    }
  
    @Override
    void initialize() {
       System.out.println("Cricket Game Initialized! Start playing.");
    }
  
    @Override
    void startPlay() {
       System.out.println("Cricket Game Started. Enjoy the game!");
    }
 }

 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!");
    }
 }

public class template {
    public static void main(String[] args) {
 
        Game game = new Cricket();
        game.play();
        System.out.println();
        game = new Football();
        game.play();      
     }
}

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

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