摘要:2010年,我參加了湖南某礦業監控平台的開發,在這次項目中,我擔任了系統設計和開發的工作。該項目是湖南某礦業的一個集水質污染數據的采集,監測,報警,統計,和對數據采集儀器進行控制的平台。本論文結合作者的實踐,討論了設計模式在這次開發中的運用,包括設計中用到的幾種設計模式,主要有觀察者模式,工廠模式,策略模式等,並且為以后系統設計的復用提供了可能。通過這些模式的使用,有效的提高了系統的靈活性,擴展性和可維護性。這個項目的成功實施,有效的監控了礦業的排污,為企業的污染治理提供了決策,從而為建設綠色環保型企業貢獻了一點綿薄之力。
本論文先討論設計模式的理論概念,然后介紹湖南某監控平台,接着介紹在本項目中使用到的幾種設計模式以及運用這些模式的原因和取得的效果,最后是討論系統可以改進的地方。
正文
設計模式是人們在多年的軟件設計中積累下來,對可復用設計的一個總結。使用設計模式,能夠提高系統的可擴展性,可靠性,可重用性。在GOF介紹中,一共有23種設計模式,分為了三個類別:創建型,結構型和行為型。其中創建型主要是對象實例化的抽象,包括:工廠模式,建造者模式,單例模式,原型模式。 結構型主要是將各種類或者對象結合在一起形成更大的結構,主要有:裝飾模式,適配器模式,門面模式,享元模式,代理模式,合成模式,橋接模式。行為型主要是在不同的對象之間划分責任和算法的抽象,主要有:策略模式,命令模式,迭代模式,觀察者模式,中介者模式,模板模式,訪問者模式,備忘錄模式,職責鏈模式,狀態模式,解釋器模式。
湖南某礦業是一家礦業的開采,生產,加工的大型公司。為了有效及時的監控企業的排污,公司急需一套能夠檢測水質的平台。這次我們設計的這個平台,就是這樣的一個集水質污染數據的采集,檢測,報警,統計和對數據采集儀進行管理的平台,它由.NET(c#)+SqlServer2005+PLC開發。平台的架構主要由C/S和B/S組成,C/S由采集儀,PLC通訊層,工控機組成,其中采集儀完成數據的采集,PLC負責工控機和采集儀之間的通訊,工控機負責對采集儀的控制,完成數據的采集,用不同監測圖的顯示監測數據,以及將實時數據傳輸至數據庫服務器持久化。B/S由客戶PC,數據庫服務器和WEB服務器組成,其中數據庫服務器負責實時數據的存儲,WEB服務器和客戶端PC一起負責實時數據的檢測,監控,污染濃度超標時的報警,以及實時數據的管理(查詢等)。網絡圖示如下所示:

經過我們的分析,從系統的可擴展性和靈活性出發,在檢測平台中,有三個地方可以運用設計模式:
2)B/S中的報警功能,當不同濃度的污染物超標時,要對公司的管理人員進行不同方式的報警,如果按照一般的思路,這里將會有多個IF/ELSE判斷混雜在我們的類里,耦合度比較大,以后要來修改比較麻煩。策略模式是一種將各自的算法封裝,使得這些算法可以相互替換而不影響客戶端的一種設計模式。所以在這里我們決定采用策略模式:將不同濃度下采取的不同報警封裝為不同的策略類,此外,建立一個上下文類,進行不同濃度的條件判斷選擇對應的具體策略類。這樣一來,提供給外部的就只有一個上下文類了,從而將IF/ELSE判斷進行了封裝,將算法和環境獨立開來,有利於類與類之間的高內聚,低耦合。設計類圖如下所示:

3)B/S中的數據庫持久化。現在數據庫服務器上我們使用的SQL SERVER2005.隨着業務的發展和數據量的增大,未來有可能使用其他類型的數據庫。工廠模式是一種創建型的設計模式,它“生產”出客戶端所需要的“產品”,使客戶端在不涉及到復雜的創建細節下“消費”和使用該產品,免除了直接創造該產品的責任,所以在持久化這里采用了工廠模式。 整個B/S部分分為如下幾層:WEB表現層,BLL業務邏輯層,IDAL數據持久接口層,SQLServerDALSQLSERVER數據持久層,DALFactory數據持久工廠類,Model實體層。其中IDAL是數據持久層的接口,定義了操作Model的方法。SQLServerDAL是具體的數據持久層,此處是SQLServer,它實現了IDAL.DALFactory是數據庫持久層的工廠類,它根據在web.config中XML配置的具體持久層程序集名稱,使用反射的方法實例出具體的數據持久層。系統的各層關系為:WEB引用BLL,BLL通過DALFactory的工廠方法獲取具體的數據持久層。當我們需要實際的數據持久層時,就只要通過DALFactory就可以了。這樣一來,如果以后要替換其他的數據庫,我們只要開發出實現了IDAL的具體數據庫持久層,修好web.config里的XML配置就可以了,非常方便系統持久層的修改。設計類圖如下所示:
如上所述,在系統的設計中,考慮了系統中的不變和可變的地方,使用了觀察者模式,工廠模式和策略模式,不但提高了系統的擴展性,可修改性,靈活性,而且有利於設計的復用,為以后類似的項目開發,打下了一個良好的基礎。值得指出來是,系統中還存在一些需要改進的地方,例如,現在的工控機與PLC通訊層是采用串口來通信的,耦合性比較大,還沒有將通信的這一部分抽象出來。如果未來采用其他的方式來通訊,例如TCP,就有可能造成極大的修改。所以這個地方也是需要以后來繼續完善的一個地方。
