1. 程式人生 > 實用技巧 >設計模式-Strategy模式(3)

設計模式-Strategy模式(3)

策略模式的使用動機?

  • 在軟體構建的過程中,某些物件使用的演算法可能是多種多樣的,經常改變,如果將他們都編碼到物件中,那麼物件會變得異常複雜,並且有時候支援不會用到的演算法也會是一個性能負擔。
  • 為了在執行時根據需要透明的更改物件演算法,事項物件本身的解耦
  • 一句話概括:一個類的行為或演算法可以在執行時更改。

什麼是策略模式?

定義了一系列演算法,把他們一個一個的封裝起來,並且使他們可以互相替代(變化)(就是支援變化),該模式使得演算法可以獨立於使用它的客戶程式(穩定)而變化(擴充套件,子類化)
在這裡插入圖片描述

用於在什麼場景使用?

  • 如果在一個系統裡面有許多類,它們之間的區別僅在於它們的行為,那麼使用策略模式可以動態地讓一個物件在許多行為中選擇一種行為。
  • 一個系統需要動態地在幾種演算法中選擇一種。
  • 如果一個物件有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。
  • 不希望客戶端知道複雜的、與演算法相關的資料結構,在具體策略類中封裝演算法和相關的資料結構,提高演算法的保密性與安全性。

具體怎麼使用

  • 在策略模式中,我們建立各種表示策略的物件和一個行為隨著策略物件改變而改變的context物件。策略物件改變context物件的執行演算法。
  • 重構中 swich case 散彈,就是if else 它是結構化時代中分治的思想,而我們是可以用面向物件中的抽象來解決,就是說你使用判斷語句,並且可能會擴充套件的時候,使用策略模式,就是說看到if else就是看到程式中的壞味,當然,固定次數的判斷語句不需要,
  • 還有就是if else可能會有一些效能負擔,就是說,比如軟體裝到德國,使用if else就會只調用德國的語句,但是其他的語言也是在程式碼段中,就是說裝載到程式碼段中卻不被使用,而策略模式是多型呼叫,用到哪個調哪個,具有更好的本地性,因為程式碼在程式碼段,最好是在cpu的高階快取裡,程式碼段過多就要有一些到主存中,

要點

  • 策略模式以及他的子類為元件提供了一系列可重用的演算法,從而可以使得型別在執行時方便的根據需要在各個演算法之間進行切換
  • 策略模式提供了使用判斷語句以外的另一種選擇,消除條件判斷語句,就是在解耦,含有許多條件判斷語句的程式碼都需要策略模式
  • 如果stategy物件沒有例項變數,那麼各個上下文可以共享一個策略物件,從而節省物件開銷