大話--策略模式

策略模式

定義:

策略模式定義了算法族,分別封裝起來,讓它們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。(其實相似於if-else模式)java

設計原則:

將一個類中常常改變或者未來可能改變的部分提取出來,做爲一個接口而後在類中包含這個對象的實例,這樣類的實例在運行時就能夠隨意調用實現了這個接口的類的行爲。原理是用多態實現的。算法

適用場景:

系統有不少類,它們的區別僅在於行爲不一樣,一個系統須要動態地在幾種算法中選擇一種。框架

組成:

策略模式中包含三部分:
策略(Strategy):策略是一個接口,該接口定義若干個算法標識,即定義了若干個抽象方法。
具體策略(ConcreteStrategy):具體策略是實現策略接口的類,具體策略實現策略接口所定義的抽象方法,即給出算法標識的具體算法。
上下文(Context):上下文是依賴於策略接口的類,即上下文包含有策略聲明的變量。上下文中提供一個方法,該方法委託策略變量調用具體策略所實現的策略接口中的方法。ide

優缺點:

優勢:符合開閉原則,增長程序的可擴展性和可維護性;避免多個if-else判斷
缺點:客戶端必須知道全部策略類,並自行決定使用哪個策略類this

類圖:

Strategy接口定義了一個算法族,均實現了behavior()方法。
Context是使用到該算法族的類,它的dosomething()方法會調用behavior(),setStrategy(Strategy)方法能夠動態地改變strategy對象,即動態改變Context使用的算法。
設計

tip:

通常狀況下,策略模式會結合工廠模式或單例模式一塊兒使用code

使用策略模式的源碼:

java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()
Spring框架中的Resourse以及初始化接口InstantiationStrategy對象

具體實現:

//定義一個策略接口
public interface  tmpStrategy{
    void quack();
}
//定義具體策略方法
//普通鴨子呱呱叫算法
public class IsQuack implements  tmpStrategy{
    @Override
    public void quack(){
        System.out.println("普通鴨子呱呱叫");
    }
}
//橡皮鴨子吱吱叫算法
public class Squeak implements  tmpStrategy{
    @Override
    public void quack(){
        System.out.println("橡皮鴨子吱吱叫");
    }
}
//木頭鴨子不會叫算法
public class MuteQuack implements  tmpStrategy{
    @Override
    public void quack(){
        System.out.println("木頭鴨子不會叫");
    }
}
//客戶端調用算法
public class Context {
    //注入策略接口之後,才能夠選擇策略。
    private tmpStrategy strategy;

    public Context(tmpStrategy strategy){
        this.strategy = strategy;
    }

    public void setQuackBehavior(){
        strategy.quack();
    }

    public static void main(String[] args) {
        System.out.println("guagua");
        Context context1 = new Context(new IsQuack());
        context1.setQuackBehavior();

        System.out.println("zhizhi");
        Context context2 = new Context(new Squeak());
        context2.setQuackBehavior();

        System.out.println("nono");
        Context context3 = new Context(new MuteQuack());
        context3.setQuackBehavior();
    }
}
相關文章
相關標籤/搜索