前期提要…
上次跟大家分享了工廠模式(Factory Pattern)實際應用(可以點連結回顧一下),
主要是說明產生excel報表可以透過工廠模式(Factory Pattern)來處理,
那今天我們一樣拿這個範例再進一步做說明,產excel報表中所需要的工作表(sheet)該如何處理?
先幫大家稍微複習一下前一篇提到工作表的部分…
由於會有各種工作表,故我們會有一個工作表介面=>WorkSheet,並且提供Method=>GetSheetName()。
public interface WorkSheet { string GetSheetName(); }
然後我們繼承WorkShee實作一張工作表=>Report01Sheet,並且實作GetSheetName()。
public class Report01Sheet : WorkSheet { public string GetSheetName(string name) { return name; } }
但等等…有沒有覺得哪裡怪怪的呢?
只有提供取得工作表名稱的Method,那我工作表的內容呢?總不可能憑空而來吧!
是的,接下來就是我們今天要說明,該如何建立工作表的內容!
首先,工作表會有什麼東西呢?
需要有資料、標題以及內容,另外工作表也會有樣式,並且還要計算合計。
既然明確的知道建立一個工作表,必須具備上述提到的東西,
那這樣原本的工作表介面(WorkSheet)就得調整一下,
補上建立工作表會用到的Method=>GetData()、Header()、Content()、Total()、Style()。
public interface WorkSheet { string GetSheetName(); //取得資料 internal abstract void GetData(); //標題 internal abstract void Header(); //內容 internal abstract void Content(); //合計 internal abstract void Total(); //樣式 internal abstract void Style(); }
除了以上的Method,還要提供一個Mehtod,去建立工作表的流程=>CreateWorkSheet()。
而當呼叫這個Method時,就會去處理剛才提到的那些過程(要取得資料、處理標題、內容、樣式,以及計算合計)來產生出工作表。
public interface WorkSheet { ...... public void CreateWorkSheet() { GetData(); //取得資料 Header(); //標題 Content(); //內容 Total(); //合計 Style(); //樣式 } }
所以當我們今天要產生一個完整的Report01Sheet,就得繼承WorkSheet(),並且複寫裡面的Method進行實作。
public class Report01Sheet : WorkSheet { ...... internal override void GetData() { //實作取得資料 } 其他Method以此類推.... }
那當我們今天要建立出Report01Sheet這張工作表時,我們就可以:
new Report01Sheet().CreateWorkSheet();
而以上的做法就是套用建造者模式的概念來實作,
主要就是我們把定義好產工作表的方式,不管今天要建立哪種工作表,
我們都需要有GetData()、Header()、Content()、Total()、Style()去進行實作,
也就是工作表的產生依舊圍繞在取得資料、處理標題、內容、樣式,以及計算合計。
那如果要再建立一個工作表Report02Sheet,可以直接繼承Report01Sheet(),然後把部分Method複寫掉。
像是資料來源可能不同,所以GetData()得複寫掉。
又或是今天標題有改變,就把Header()複寫掉。
那如果處理Content()都一樣,那就維持原狀即可。
以上就是這次的分享,感謝大家收看~~~~~~