iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
Software Development

淺談物件導向與Design Pattern介紹系列 第 29

IT鐵人DAY 29-Template Method 模板模式

  今天要要介紹最後一個 Behavioral Patterns,也就是Template Method,我想大多數的人看到這個名字就可以約略的猜到這個模式是用來套版用的,現在就來了解它的運作模式吧!


問題情境與解析

  假設現在有個程式是用來分析文件,使用者可以用各種格式(如TXT、CSV等等)的文檔,再用此程式來提取這些文檔中的資訊,而目前的程式會根據不同格式的檔案,給對應的類別去處理文件,而這些處理不同格式檔案的類別除了處理格式的程式完全不同,其他的資料處理程序幾乎一模一樣,因此程式的重複性很高。

  要解決以上的問題,就可以使用模板模式。首先,我們將處理檔案的步驟一一轉成方法,而這些方法會由一個主要的方法(模板方法)來調用,這些都會寫在抽象類別裡面。然而這些步驟的方法可以是抽象的,不一定要先寫好步驟內容,再來就讓子類去實現所有的抽象步驟,如果需要的話,也可以複寫一些可選步驟,但不是模板方法本身。

  另外還有一種類型的方法,稱為***hooks***,它是個可選的步驟,即使沒有複寫hook,模板方法還是能夠運作。通常hook會放在關鍵步驟之前或之後,為子類提供額外處理資料的擴展點。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20211014/20140743dmCn9D4BT7.png

Skeleton Code

abstract class Template {
    
    public final void MainMethod() {
        if (step1()) {
            step2();
        }
        step3();
    }
    
    public boolean step1() {
        return false;
    }
    
    public void step2(){};
    
    public abstract void step3();
}

class ConcreteTemplate1 extends Template {
    
    public boolean step1() {
        return true;
    }
    
    public void step2() {
        // step2 operation
    }
    
    public void step3() {
        // step3 operation
    }
}

class ConcreteTemplate2 extends Template {
            
    public void step3() {
        // step3 operation
    }
}

  如果想要擴展處理流程的特定步驟,而不是整個流程或是其結構的話,就可以使用模板方法來解決此問題,它會將整個處理流程轉換為一系列單獨的步驟,因此子類就可以去實做或複寫這些步驟,也不會改變父類別所定義的結構,不過可能會受到已定義的結構而限制了步驟的延伸,倘若模板方法的步驟越多的話,維護起來也就越困難。

  以上就是Template Method的介紹,希望大家看完以後可以有所收穫,並且能夠實際的實做一次!


除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章

lu23770127 - SASS 基礎初學三十天

10u1 - 糟了!是世界奇觀!

juck30808 - Python - 數位行銷分析與 Youtube API 教學

SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?


上一篇
IT鐵人DAY 28-Observer 觀察者模式
下一篇
IT鐵人DAY 30-學習物件導向與Design Pattern之心路歷程
系列文
淺談物件導向與Design Pattern介紹30

尚未有邦友留言

立即登入留言