在這個設計模式初學者系列里我將改變以前的風格,今后每一篇都以真實的項目重構例子來描述重構到模式,所有的描述都來源于現實,如果沒有現實的案例那我寧愿不寫。希望以這種方式記錄能夠給一些像我一樣曾經很困惑的朋友幫助。
背景
PM:小Y,你看,這個Dundas的Chart(注1)控件效果很好,功能也很強大,但是使用的時候太麻煩了,你能不能將其封裝一下,這樣其他人使用的時候也簡單多了
我:嗯,這個我看看吧,應該可以。
注1
Dundas Chart控件是一個既可以用在WinForm里又可以用在WebForm里的圖表控件,可以繪制各種曲線圖、柱狀圖和餅圖等等,功能十分強大。在本文中我們要了解Dundas Chart的三個概念:Chart、ChartArea、Series
如是我拿起紙和筆去收集需求:
A:這個我覺得當這個控件上的一個Series的Enabled屬性值變化的時候應該觸發一個事件,這樣我們就可以在這個事件觸發時干些事情了,但是現在沒有,我不得不做很多工作
B:和A一樣的問題,我覺得控件上一個ChartArea的Visible屬性值變化時也應該觸發一個事件。
C: ………
我的頭慢慢的大起來,需求收集了一大堆,怎么弄呢?我還是做了下面這樣的個設計
第一次重構:使用繼承封裝Chart原生API,使其更好使用
我相信很多人第一個設計也許是這樣,一下子就想到繼承,這樣我們可以復用Dundas Chart里面的很多東西了,以免重寫很多東西。
下面只選取一段Code:
public class JurassicSeries : Series
{
//...更多擴展
public event EventHandler SeriesEnabled;
protected void OnSeriesEnabled()
{
if (SeriesEnabled != null)
SeriesEnabled(this, new EventArgs());
}
public new bool Enabled
{
get { return base.Enabled; }
set {
base.Enabled = value;
OnSeriesEnabled();
}
}
//.....更多擴展
}
使用繼承擴展Series后,我們終于有了這個事件了,但是因為Dundas并沒有將他們的一些屬性加上virtual,沒辦法,我只好在這些屬性前加上new了,看著總是挺別扭。然后我將新的控件發布給項目組成員,大家都很高興,幾乎不需要改什么代碼就可以享受到更好的“服務”了。
但是問題也接著而來
A:使用你這個控件后,我將控件上的內容保存為xml的時候怎么和原來的xml模板不再一樣了啊,而且有的時候還老出現一些怪異行為,控件好像工作的不怎么穩定
原來Dundas的保存xml文件功能是通過反射將屬性一個個作為XmlNode的Attribute,在我擴展的時候我給控件添加了一些屬性,這樣保存的XML文件當然不同了,而且由于使用了繼承這種白箱復用機制,有的地方改變了控件的默認行為,所以帶來控件工作不穩定,怎么辦?看來繼承也不是靈丹妙藥,我不得不再一次陷入思考,尋找別的良方。
文章來源于領測軟件測試網 http://www.kjueaiud.com/