【LabVIEW技巧】策略模式


前言

在之前的文章提到了如何學習OOP以及對應的簡單工廠模式,由於時間比較長,我們先回顧一下原有內容,然后繼續了解新的模式。

為什么學習OOP

在測控系統的軟件開發過程中,LabVIEW工程師一直認為程序完成功能就可以了,但是隨着程序越來越復雜,漸漸發現很多情況下成型系統到后期無法添加功能或很難添加功能。

是什么阻礙了軟件系統的開發?為什么在需求溝通不明確的前期,我們無法開發軟件;在需求明確的后期,又難以對軟件進行靈活修改。

與軟件維護類似的情況最先出現在 刻板 應刷中,那時的古人一旦設計完成系統,將祈求不再變更。因為一旦變更,其代價就會非常大,需要重新制版印刷,如果連續變更就會意味着連續的修改刻板,帶來了人力和物料的大量浪費
 但是,聰明的中國人,將每一個字都做一個小的刻板,印刷系統將會變為如下的例子
通過某些小模塊的替換,可以讓印刷更加靈活多變,這種思想的轉變也就是活字印刷的成功。

在軟件設計的過程中,“活字印刷”術即對應着常見的面向對象思想。通過單一職責原則,OOP可以將系統分割為功能單一的很多小模塊,通過小模塊的拼接、組織形成不同的程序。一旦任何一處的模塊發生了變化,我們只需修改固定的一些模塊,即可讓系統發生變化。

在軟件設計的歷史上,OOP的出現也引發了一場設計的革命,這也是我們不得不學習OOP思想的重要原因。

簡單工廠模式

既然了解了OOP思想,那OOP的第一個使用方法莫過於簡單工廠模式。
通常,在傳統的面向過程設計中,使用Case結構來解決不同情況的出現
 
但是當多個函數中都需要進行判斷時,Case結構將會寫很多個,並且每一次維護代碼均需要了解之前的設計,極易造成誤修改。
為此,簡單工廠模式出現,實現了程序設計的簡化。

了解UML類圖,可以發現程序在運行時動態選擇執行的內容,通過類的繼承,可以實現對原有方法的輕易拓展;改動的時候不影響主程序的原有設計,實現了針對接口而不是實現編程。

 策略模式

策略模式的學習,我使用《大話設計模式》的例子,做一個深入的了解和熟悉。

該模式的目的是實現一個商場收銀軟件,通過文本框來輸入單價和數量,從而計算輸出的結果。

使用傳統的方法快速設計,不超過10分鍾就完成功能  
當代碼 完成 后,新的需求改動隨即而來。商場需要增加打折系統,可以對輸出的總價進行不同程度的打折。於是,程序增加打折功選項,支持不打折和打不同折操作,設計完成的代碼如下。
當商場需要增加滿減活動(如滿200減30) 時,我們又需要改動程序,增加一個子VI,並且修改程序的連線。

簡單工廠實現

為了避免對主程序頻繁修改,嘗試使用OOP思想對該程序進行改進。

分析程序需求,發現金額計算算法是這段程序中最容易變化的部分,所以對這段算法進行抽象,抽象后的類圖如下。

算法抽象 

在程序中,我們將變化的部分抽象為AbstractCash,其具有AcceptCash的方法,可以輸入當前的金額,並且返回計算后的結果。
  對於采取的商城策略一共有3種類型的處理方式,我們繼承抽象並實現這一方法。

對於CashNormal,我們不做任何處理。
 對於CashRebate,可以配置打折比例,並且在運算中對其進行相應的處理

 
CashReturn不同於其他算法,需要增加moneyCondition與m oneyReturn兩個參數來計算是否執行返現
至此,我們完成了算法的設置,接下來設計工廠類。

工廠設計 

此處由於工廠類只有一個方法,也沒有屬性,所以使用一個子VI來代替類
不打折時,我們使用不打折的類作為輸出
 打八折時,我們使用CashRebate作為輸出
 設計滿減活動時,我們需要使用CashReturn來滿足需求

主程序設計

完成設計后,主程序只需要調用抽象的方法即可編寫程序
當某一類的方法拓展時,我們只需要在工廠分支中增加一個Case即可,如打7折。除此之外不碰任何的其他程序,實現了程序的快速拓展,而又不影響原有的代碼。
 如拓展一個滿減活動時,我們同樣只改動簡單工廠的方法
如拓展一個新的打折活動,如打折積分活動,我們只需要在類圖上新增一個繼承類,並修改簡單工廠即可。
經過試驗,整個程序既具有了完善的功能,也實現了特殊變化點的快速拓展。

策略模式實現

簡單工廠的程序已經使用到了策略模式的思想,通過抽象運算策略,來實現頂層方法的復用,這里在此基礎上,引出策略模式的設計類圖。
在策略模式中,我們定義了一個抽象的策略,AbstractCash和3個具體的策略,分別是CashNormal、CashRebate、CashReturn。這里的策略與上文簡單工廠中的策略是一樣的,不同僅僅在策略模式選擇的地方稍有差別。

為了封裝策略的變化,使用CashContext聚合AbstractCash,利用GetResult的多態,實現不同策略的替換
在接口設計時,結合簡單工廠模式,可以將程序改進為工廠+策略模式
使用策略模式封裝后發現,相比於簡單工廠模式的例子,
1.在頂層程序完全封裝了算法,只需要與給出的預定API交互即可
2.底層的算法變更不會影響主程序的設計,實現了策略的封裝和拓展

 繼續優化代碼

策略模式中,我們仍需要每次修改枚舉的時候重新編寫Case結構。為此,優化工廠的解析策略,可以實現自動初始化特定的類,修改如下
 通過正則表達式,對枚舉的規則進行解析,可以實現自動選擇正確的執行策略,從而后續的代碼修改將只針對於界面上數值的變化。

總結

本文回顧了之前的OOP設計文章,並且借用商城打折的例子,設計了基於簡單工廠的程序,通過對策略的分析,了解了簡單工廠和策略模式的聯合設計。最后使用開閉原則,將程序的改動僅僅停留在了控件的變更,實現了代碼的可拓展和可維護。

后記

感謝大家這么長時間的關注,也謝謝各位的打賞和認可。接下來的一段時間,小黑將要忙自己的婚姻大事去啦,期間的一些學習內容將會在結婚后更新,希望大家多多支持~

撒一波狗糧~~~~~
 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM