3 Strategy Pattern(策略模式)

2021-09-24 15:54:19 字數 1271 閱讀 2669

當有乙個演算法(廣義上的),它的功能是確定的,具體實現要視具體情況而定,比如計算不同國家稅的演算法,具體實現得看是哪個國家,那麼一般想到的做法是用if-else或者switch-case來判斷值,呼叫不同的計算函式:

class countfuncs

void func2()

void func3()

void func4()

}class gettaxelse if(countryname.equals("america")) else if(countryname.equals("england")) else if(countryname.equals("japan"))

}}

我們看這個**寫得好不好,要放到時間軸上去看,要放到變化的角度去看,所以這個情況下很容易出現的乙個變化是,要出現乙個新的國家了怎麼辦,再增加乙個func5,然後新增else if?這樣又違反了開閉原則——類對擴充套件開放,對修改關閉。

那麼我們就要將對方法的擴充套件改為對類擴充套件,將每乙個方法編成乙個類,而if-else則像templatemethod中一樣,由引數傳遞,從子類轉到父類,來同一成父類的引用,但實際上是呼叫子類的具體實現函式:

abstract class tax

class chinatax extends tax

}class americatax extends tax

}class englandtax extends tax

}class japantax extends tax

}class gettax

}

這樣寫雖然類變的很多,但是卻是符合開閉原則的。

有人會說,雖然這裡通過函式引數傳遞將自子類轉到父類,來避免if-else,但是在呼叫gettax方法的方法裡,依然要使用if-else來從使用者輸入的字串確定傳遞過來的是哪個子類吧。這個得學了工廠模式才能解決這個問題。

那麼什麼時候該使用if-else,什麼時候不該使用if-else呢?

當這個if-else在未來可能會被擴充套件時,如上面這個例子,則要考慮使用策略模式。

當if-else在未來也不可能被擴充套件時,如一周七天,則不需要。一般自然規律是固定的,而客戶需求是可能會被擴充套件的。

策略模式一般有乙個抽象類,裡面只有乙個實現演算法的函式,然後又若干個繼承該抽象類的子類,乙個類中也是只有乙個實現演算法的函式。

策略模式的重點是乙個演算法的多種實現,這個演算法的實現方式在將來有可能還會被擴充套件,而模板方法模式的重點是,乙個演算法的整體流程是不變的,但是其中幾個步驟會隨情況不同而變化。

關於 0x3f3f3f3f 的問題

0x3f3f3f3f是乙個很有用的數值,它是滿足以下兩個條件的最大整數。1 整數的兩倍不超過 0x7f7f7f7f,即int能表示的最大正整數。2 整數的每8位 每個位元組 都是相同的。我們在程式設計中經常需要使用 memset a,val,sizeof a 初始化乙個陣列a,該語句把數值 val ...

0x3f3f3f3f(無窮大數)

一般定義無窮大數都是inf 99999999,或者0x7f ff ff ff,但是有的時候inf過大,雖然保證了沒有數超過它,但是在需要加上乙個數的時候,inf a可能會導致溢位,最終變成乙個負數。而0x3f3f3f3f的數量級也1e9的,一般題不會給超過1e9的數 在把它當成無窮大的時候,兩個0x...

Python3物件導向 3 異常(3)異常作用

當丟擲異常時,看起來好像立即停止了程式的執行。丟擲異常之後的所有 都不會執行,除非處理了這一異常,程式將會退出並給出錯誤資訊。def no return print i am about to raise an exception raise exception this is always rai...