java設計模式-策略模式

策略模式與觀察者模式一樣屬於行爲型模式類別,對於某種功能的實現,根據環境的不同可以用不同的方式實現,這裏的每一種實現方式可以對應一種策略;百度百科上講:策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶且獨立變化。
策略模式結構:
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)客戶端必須知道所有的策略類,以便能根據環境進行不同的選擇

                                                                   -_-沒有天才,只有勤奮的天才
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章