目錄
什么是策略模式
應用場景
業務場景實現
抽象類
實現類
Context上下文
測試類
策略模式的優缺點
什么是策略模式
他將定義的算法家族、分別封裝起來,讓他們之間可以相互替換,從而讓算法的變化不會影響到使用算法的用戶。
策略模式使用的就是面向對象的繼承和多態機制,從而實現同一行為在不同場景下具備不同實現。
應用場景
策略模式在生活中應用很多。比如一個人的膠水比例與他的工資有關,不同的工資水平對應不同的稅率;再比如我們在下單前需要選擇支付方式,或者是商店折扣、比如支付寶、微信等。
策略模式可以解決在多種算法相似的情況下,避免使用if.else或switch…case帶來的復雜性和臃腫性。在日常業務開發中,策略模式適用于以下場景:
首先看下策略模式的通用UML類圖:
從類圖中,我們可以看到,策略模式主要包含三種角色:
上下文角色(Context)
用來操作策略的上下文環境,屏蔽高層模塊(客戶端)對策略,算法的直接訪問,封裝可能存在的變化。
抽象策略角色(Strategy)
規定策略或算法的行為
具體策略角色(Concrete Strategy)
具體的策略或算法實現
業務場景實現
抽象類
/*** 策略類,定義所有支持的算法公共接口*/
/*** 抽象算法類*/
public abstract class strategy {//算法方法public abstract void algorithmInterface();}
實現類
public class ConcreteStrategyA extends strategy{@Overridepublic void algorithmInterface() {System.out.println("算法A實現");}
}
public class ConcreteStrategyB extends strategy{@Overridepublic void algorithmInterface() {System.out.println("算法B實現" );}
}
public class ConcreteStrategyC extends strategy{@Overridepublic void algorithmInterface() {System.out.println("算法C實現");}
}
Context上下文
/*** 上下文,維護對象的引用*/
public class content {strategy strategy;public content(策略模式.strategy strategy) {this.strategy = strategy;}public void contentInterface(){//根據具體的策略對象,調用琦算法的方法strategy.algorithmInterface();}
}
測試類
public class main {public static void main(String[] args) {content content1;content1 = new content(new ConcreteStrategyA());content1.contentInterface();content1 = new content(new ConcreteStrategyB());content1.contentInterface();content1 = new content(new ConcreteStrategyC());content1.contentInterface();}
}
策略模式的優缺點
優點
- 策略模式符合開閉原則
- 避免使用多重條件轉移語句,如if…else和switch這種。
- 使用策略模式可以提高算法的保密性和安全性
缺點
- 客戶端需要知道所有的策略,并且自行決定使用哪一個策略類
- 代碼中會產生非常多的策略類,造成代碼的臃腫,怎加維護難度。