目的:算法
把算法封裝起來,而且使他們能夠相互替換,使得算法能夠獨立於使用它的客戶而變化。函數
適用情景:指針
一、 許多的類僅僅是行爲有異(數據一致),」策略」提供了一種用多個行爲中的一個行爲來配置一個類的方法。對象
二、 須要使用不一樣的算法,如能夠根據不一樣參數選取不一樣的效率算法。接口
三、 算法使用客戶不該該知道的數據。it
四、 替換多個if/else或switch語句編譯
UML描述:效率
協做:擴展
Strategy和Context相互做用以實現選定的算法。當算法被調用時,Context能夠將該算法所需的數據傳遞給該Strategy。或者Context將自身做爲一個參數傳遞給Strategy。配置
Context將它的客戶的請求轉發給它的Strategy。客戶一般建立並傳遞一個ConcreteStrategy對象給Context;這樣,客戶能夠選取不一樣的ConcreteStrategy與Context交互。客戶選取Strategy時須要瞭解這些Strategy到底有何不一樣,此時可能不得不向客戶暴露具體的實現問題。
數據接口的實現問題:
1) 定義Strategy和Context接口
一種辦法是將Context將參數逐個傳給Strategy的操做方法;另外一種是讓Context將自身做爲一個參數傳給Strategy的操做方法(可能有的數據是沒必要要的,可是接口簡潔)
2) 將Strategy做爲模版參數
使用這種方法不須要給Strategy定義接口的抽象類,把Strategy做爲一個模版參數也使得能夠將一個Strategy和它的Context靜態綁定在一塊兒,從而提升效率。
適用條件:1) 能夠在編譯時選擇strategy 2)strategy不須要在運行時改變
3) 使Strategy對象成爲可選的
這種情形經過定義Strategy對象的缺省行爲來實現,當Context訪問Strategy時需先判斷Strategy是否存在,若是客戶使用缺省的行爲就不須要處理Strategy對象。
擴展:
Strategy也能夠被封裝成單例形式,在Context中經過指針方式與Strategy交換(c語言的話也能夠用函數指針實現)