選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
2 分鐘閱讀時間 (448 個字)

建造者模式(Builder Pattern)-實際應用

unsplash-coding002

前期提要…
上次跟大家分享了工廠模式(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()都一樣,那就維持原狀即可。

以上就是這次的分享,感謝大家收看~~~~~~

[C#] Lambda介紹
Azure Event Grid

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/05/19, 週日

Captcha 圖像