策略者模式
場景:
你想買一盞臺燈,現在有很多類型的臺燈,分別為:紅色的 綠色的,大的 小的等等。你可以選擇其中的某一種。
現在出現了新的產品智能調節的臺燈,那麽我們應該怎麽辦呢?
把臺燈能夠調節的行為加到父類中?顯然這是不合適的,因為這樣會讓別的燈也具有調節功能。那麽現在我們可以使用接口添加調節功能,讓有些燈能夠進行調節而其他的卻不能
現在又出現了各種方式的調節功能,我們可以實現調節的接口,那麽我們怎樣去動態選擇不同方式的調節呢?可以通過調用接口來調用不同的調節方法
現在看來每個具體的燈如果具有調節功能都必須要實現調節接口,這樣會造成再出現新的可以調節的燈時就要實現調節接口,隨著燈的類型越來越多,這樣將成為一個噩夢。
那麽我們怎樣去改正呢?好的設計就是把抽象的階層設計好,當出現新的東西的時候,不改變原有的代碼,而是增加新的東西(開閉原則)。
把AdjustInter放在Lamp抽象類中,去用AdjustInter提供的方法,同時可以隨意選擇調節的方式
由於Lamp與AdjustInter之間是關聯關系,所以應該在Lamp抽象類中采用聲明屬性的方式,來放在抽象類Lamp中,聲明adjust()方法使用調節功能,同時使用setAdjustInter(AdjustInter adjustInter)來選擇不同的調節方式。
通過上面我們就可以知道,調節接口擁有一系列的調節方式,能夠提供給使用者即Lamp使用,同時也能夠隨時選擇替換不同的調節方式。這就是策略者模式,即:通過提供一個擁有一系列策略的接口,使 使用者能夠使用並且可以隨時進行策略的選擇替換。
這裏我們看到每次我們需要更改調節方式都是通過setAdjustInter(AdjustInter adjustInter),這就要求我們知道所有的策略。這也是策略者模式的缺點:使用者必須知道所有的策略
優點就是:動態改變策略
策略者模式