天天看点

设计模式之Template

作者:人间值得911

Template 模板模式定义:

定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中。

设计模式之Template

模板模式(Template Pattern)是一种行为型设计模式,它定义了一个算法的框架,将一些步骤的实现延迟到子类中,使得子类可以根据自己的需求来实现这些步骤。模板模式使得算法的框架可以被复用,而具体的步骤可以在运行时动态地替换。

模板模式的主要优点有以下几点:

  1. 复用性:模板模式提供了一个算法的框架,这个框架可以被多次复用,而不需要重新编写整个算法。
  2. 灵活性:模板模式将算法的框架和具体步骤的实现分离开来,使得算法可以根据具体需求进行灵活的扩展和修改。
  3. 可维护性:模板模式将算法的复杂度转移到了子类中,使得算法更加可维护和可理解。

模板模式的主要缺点有以下几点:

  1. 过多地使用模板模式可能会导致代码的重复和冗余。
  2. 如果算法的框架比较复杂,可能会导致模板类的设计和维护变得困难。

Java 代码示例

abstract class Game {  
    abstract void initialize();  
    abstract void startPlay();  
    abstract void endPlay();  
}  
  
class Football extends Game {  
    @Override  
    void initialize() {  
        System.out.println("初始化足球比赛");  
    }  
  
    @Override  
    void startPlay() {  
        System.out.println("开始足球比赛");  
    }  
  
    @Override  
    void endPlay() {  
        System.out.println("结束足球比赛");  
    }  
}  
  
class Cricket extends Game {  
    @Override  
    void initialize() {  
        System.out.println("初始化板球比赛");  
    }  
  
    @Override  
    void startPlay() {  
        System.out.println("开始板球比赛");  
    }  
  
    @Override  
    void endPlay() {  
        System.out.println("结束板球比赛");  
    }  
}  
  
class SportsManager {  
    private Game game;  
  
    public SportsManager(Game game) {  
        this.game = game;  
    }  
  
    public void play() {  
        game.initialize();  
        game.startPlay();  
        game.endPlay();  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        SportsManager footballManager = new SportsManager(new Football());  
        footballManager.play();  
  
        SportsManager cricketManager = new SportsManager(new Cricket());  
        cricketManager.play();  
    }  
}           

在这个示例中,Game 是一个抽象类,它定义了一些抽象方法,这些方法的具体实现由子类来完成。Football 和 Cricket 都是 Game 的子类,它们分别实现了自己的 initialize、startPlay 和 endPlay 方法。SportsManager 是一个模板类,它包含了一个 Game 对象,并定义了一个 play 方法,这个方法实现了算法的框架,其中具体步骤的实现由 Game 的子类来完成。在 Main 类中,我们创建了 Football 和 Cricket 的实例,并将它们分别传递给 SportsManager 的构造函数,然后调用 play 方法来执行算法。

继续阅读