策略模式與觀察者模式一樣屬於行爲型模式類別,對於某種功能的實現,根據環境的不同可以用不同的方式實現,這裏的每一種實現方式可以對應一種策略;百度百科上講:策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶且獨立變化。
策略模式結構:
Context:環境類,聚集了策略類,是一對一的關係,並提供策略算法入口
Strategy:抽象策略類,定義了算法接口
ConcreteStrategy:具體策略類,實現具體的算法
策略模式類圖:
具體實現:
spring訪問資源(Resource就是運用了策略模式),spring中訪問資源(配置文件)方式有多種。Resource 接口是 Spring 資源訪問策略的抽象,它本身並不提供任何資源訪問實現,具體的資源訪問由該接口的實現類完成——每個實現類代表一種資源訪問策略。
Spring 爲 Resource 接口提供瞭如下實現類:
- UrlResource:訪問網絡資源的實現類。
- ClassPathResource:訪問類加載路徑裏資源的實現類。
- FileSystemResource:訪問文件系統裏資源的實現類。
- ServletContextResource:訪問相對於 ServletContext 路徑裏的資源的實現類。
- InputStreamResource:訪問輸入流資源的實現類。
- ByteArrayResource:訪問字節數組資源的實現類。
現在我們就簡單的來模擬一下,spring中對資源的訪問
環境類
class Context{
private Strategy strategy;
public void visitResourceAlgorithm(){
strategy.visitResourceAlgorithm();
}
public void setStrategy(Strategy strategy){
this.strategy = strategy;
}
}
抽象策略類
abstract class Strategy{
public abstract void visitResourceAlgorithm();
}
具體策略類
class UrlStrategy extends Strategy{
@Override
public void visitResourceAlgorithm(){
System.out.println("通過url方式訪問資源");
}
}
class ClassPathStrategy extends Strategy{
@Override
public void visitResourceAlgorithm(){
System.out.println("通過classpath方式訪問資源");
}
}
客戶端代碼
public class Main{
public static void main(String[] args){
Context context1 = new Context();
Strategy urlStrategy = new UrlStrategy();
context1.setStrategy(urlStrategy);
context1.visitResourceAlgorithm();
Context context2 = new Context();
Strategy classPathStrategy = new ClassPathStrategy();
context2.setStrategy(classPathStrategy);
context2.visitResourceAlgorithm();
}
}
策略模式的優缺點
優點:1)策略模式完美的遵循了”開閉原則”,用戶可以根據自己的環境不同來選擇算法或者添加新的算法,而不用修改原來的系統2)算法之間彼此可以相互替換,因爲它們實現功能都是一致的3)對算法族進行了統一的管理
缺點:1)不斷添加新的算法,會產生很多策略類2)客戶端必須知道所有的策略類,以便能根據環境進行不同的選擇
-_-沒有天才,只有勤奮的天才