前言
在之前的文章提到了如何學習OOP以及對應的簡單工廠模式,由於時間比較長,我們先回顧一下原有內容,然后繼續了解新的模式。
為什么學習OOP
在測控系統的軟件開發過程中,LabVIEW工程師一直認為程序完成功能就可以了,但是隨着程序越來越復雜,漸漸發現很多情況下成型系統到后期無法添加功能或很難添加功能。
是什么阻礙了軟件系統的開發?為什么在需求溝通不明確的前期,我們無法開發軟件;在需求明確的后期,又難以對軟件進行靈活修改。
與軟件維護類似的情況最先出現在
刻板
應刷中,那時的古人一旦設計完成系統,將祈求不再變更。因為一旦變更,其代價就會非常大,需要重新制版印刷,如果連續變更就會意味着連續的修改刻板,帶來了人力和物料的大量浪費

但是,聰明的中國人,將每一個字都做一個小的刻板,印刷系統將會變為如下的例子
通過某些小模塊的替換,可以讓印刷更加靈活多變,這種思想的轉變也就是活字印刷的成功。
在軟件設計的過程中,“活字印刷”術即對應着常見的面向對象思想。通過單一職責原則,OOP可以將系統分割為功能單一的很多小模塊,通過小模塊的拼接、組織形成不同的程序。一旦任何一處的模塊發生了變化,我們只需修改固定的一些模塊,即可讓系統發生變化。
在軟件設計的歷史上,OOP的出現也引發了一場設計的革命,這也是我們不得不學習OOP思想的重要原因。
簡單工廠模式
既然了解了OOP思想,那OOP的第一個使用方法莫過於簡單工廠模式。
通常,在傳統的面向過程設計中,使用Case結構來解決不同情況的出現
但是當多個函數中都需要進行判斷時,Case結構將會寫很多個,並且每一次維護代碼均需要了解之前的設計,極易造成誤修改。

為此,簡單工廠模式出現,實現了程序設計的簡化。

策略模式
策略模式的學習,我使用《大話設計模式》的例子,做一個深入的了解和熟悉。
該模式的目的是實現一個商場收銀軟件,通過文本框來輸入單價和數量,從而計算輸出的結果。

當代碼
完成
后,新的需求改動隨即而來。商場需要增加打折系統,可以對輸出的總價進行不同程度的打折。於是,程序增加打折功選項,支持不打折和打不同折操作,設計完成的代碼如下。
當商場需要增加滿減活動(如滿200減30)
時,我們又需要改動程序,增加一個子VI,並且修改程序的連線。
簡單工廠實現
為了避免對主程序頻繁修改,嘗試使用OOP思想對該程序進行改進。
分析程序需求,發現金額計算算法是這段程序中最容易變化的部分,所以對這段算法進行抽象,抽象后的類圖如下。
對於采取的商城策略一共有3種類型的處理方式,我們繼承抽象並實現這一方法。
對於CashNormal,我們不做任何處理。
CashReturn不同於其他算法,需要增加moneyCondition與m
oneyReturn兩個參數來計算是否執行返現

至此,我們完成了算法的設置,接下來設計工廠類。
工廠設計
此處由於工廠類只有一個方法,也沒有屬性,所以使用一個子VI來代替類
不打折時,我們使用不打折的類作為輸出

設計滿減活動時,我們需要使用CashReturn來滿足需求

主程序設計
完成設計后,主程序只需要調用抽象的方法即可編寫程序
當某一類的方法拓展時,我們只需要在工廠分支中增加一個Case即可,如打7折。除此之外不碰任何的其他程序,實現了程序的快速拓展,而又不影響原有的代碼。

如拓展一個滿減活動時,我們同樣只改動簡單工廠的方法
如拓展一個新的打折活動,如打折積分活動,我們只需要在類圖上新增一個繼承類,並修改簡單工廠即可。

經過試驗,整個程序既具有了完善的功能,也實現了特殊變化點的快速拓展。

策略模式實現
簡單工廠的程序已經使用到了策略模式的思想,通過抽象運算策略,來實現頂層方法的復用,這里在此基礎上,引出策略模式的設計類圖。

在策略模式中,我們定義了一個抽象的策略,AbstractCash和3個具體的策略,分別是CashNormal、CashRebate、CashReturn。這里的策略與上文簡單工廠中的策略是一樣的,不同僅僅在策略模式選擇的地方稍有差別。
為了封裝策略的變化,使用CashContext聚合AbstractCash,利用GetResult的多態,實現不同策略的替換
在接口設計時,結合簡單工廠模式,可以將程序改進為工廠+策略模式
1.在頂層程序完全封裝了算法,只需要與給出的預定API交互即可
2.底層的算法變更不會影響主程序的設計,實現了策略的封裝和拓展

繼續優化代碼
策略模式中,我們仍需要每次修改枚舉的時候重新編寫Case結構。為此,優化工廠的解析策略,可以實現自動初始化特定的類,修改如下
總結
本文回顧了之前的OOP設計文章,並且借用商城打折的例子,設計了基於簡單工廠的程序,通過對策略的分析,了解了簡單工廠和策略模式的聯合設計。最后使用開閉原則,將程序的改動僅僅停留在了控件的變更,實現了代碼的可拓展和可維護。
后記
感謝大家這么長時間的關注,也謝謝各位的打賞和認可。接下來的一段時間,小黑將要忙自己的婚姻大事去啦,期間的一些學習內容將會在結婚后更新,希望大家多多支持~
撒一波狗糧~~~~~
