在編寫代碼中,會用到各種算法和策略,我們可以根據(jù)環(huán)境的不同來選擇不同的算發(fā)或者策略來完成該功能。一些簡單的算法:如查找或者排序,我們可以將方法寫在一個算法類中,在我們想要使用的時候就調(diào)用這個類中的某一個方法就可以了。這種代碼方法我們稱之為硬編碼,如果將來需要在app或者客戶端上增加或者修改一種算法,我們就需要去修改客戶端代碼,而且會導(dǎo)致客戶端的代碼變得臃腫不利于維護。
解決方法:定義一系列的算法,把每一個算法封裝起來, 并且使它們可相互替換。策略模式使得算法可獨立于使用它的客戶而變化。
?Strategy(策略類):定義所有支持的算法的公共接口。 Context使用這個接口來調(diào)用某ConcreteStrategy定義的算法。
?ConcreteStrategy(具體實現(xiàn)類):封裝了具體的算法或者行為,繼承于Strategy。
Context:用一個ConcreteStrategy對象來配置。維護一個對Strategy對象的引用。可定義一個接口來讓Strategy訪問它的數(shù)據(jù)。
在客戶端調(diào)用的時候,首先創(chuàng)建一個context上下文對象,然后傳入我們想要的算法的對象,這個算法的對象我們已經(jīng)在客戶端通過策略模式實現(xiàn)過了,這個時候我們只需要調(diào)用就 可以了。我們在context中的實現(xiàn)方法是ContextInterface(),這個方法正好調(diào)用了Strategy接口的方法,而我們實現(xiàn)策略的ConcreteStrategy實現(xiàn)類也因為重寫了Strategy類的方法,實現(xiàn)了我們想要的算法,才構(gòu)成了我們的策略模式
工廠模式和策略模式的區(qū)別:工廠模式是創(chuàng)建型模式 ,它關(guān)注對象創(chuàng)建,提供創(chuàng)建對象的接口. 讓對象的創(chuàng)建與具體的使用客戶無關(guān)。
策略模式是對象行為型模式 ,它關(guān)注行為和算法的封裝 。它定義一系列的算法,把每一個算法封裝起來, 并且使它們可相互替換。使得算法可獨立于使用它的客戶而變化。
感覺工廠模式更靈活包含的使用方式更多,而策略模式僅僅只是一種相對固定的工具。