天天看點

設計模式之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 方法來執行算法。

繼續閱讀