策略設計模式

一、策略設計模式定義

策略設計模式是指對一系列算法的定義,並將每一個算法封裝起來,而且使他們還可以相互替換。策略設計模式讓算法獨立於他的客戶而獨立變化。

二、使用情況

1、 多個類只區別在表現行爲不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行爲。
2、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實現。
3、 對客戶隱藏具體策略(算法)的實現細節,彼此完全獨立。

三、UML圖


四、代碼實現案例

需求:根據動物類型獲取該動物喜歡吃的食物

實現方式

1、常規實現方式

提供一個方法根據動物類型返回:

  public String getFavoriteFoodByAnimalType(String type){
        if (type.equals("貓")){
            return "老鼠";
        }else if (type.equals("狗")){
            return "肉";
        }
        return "";
    }

2、使用策略模式實現

通過分析可抽象出一個接口,並提供一個獲取喜歡的食物的方法:

public interface IFavoriteFood {
    String getFavoriteFood();
}

定義兩個類,貓類、狗類實現該接口並根據自身情況進行返回:

貓:

public class Cat implements  IFavoriteFood{
    @Override
    public String getFavoriteFood() {
        return "mouse";
    }
}

狗:

public class Dog implements IFavoriteFood {
    @Override
    public String getFavoriteFood() {
        return "meat";
    }
}

定義類CallStrategyClass提供調用getFavoriteFood()方法:

public class CallStrategyClass {
    public String callStrategy(IFavoriteFood iFavoriteFood) {
        return iFavoriteFood.getFavoriteFood();
    }

    public String getFavoriteFoodByAnimalType(String type) {
        if (type.equals("貓")) {
            return "老鼠";
        } else if (type.equals("狗")) {
            return "肉";
        }
        return "";
    }

}

3、在TestClass中分別調用

public class TestClass {
    public static void main(String[] args) throws Exception{
        //創建實例
        CallStrategyClass callStrategyClass = new CallStrategyClass();

        //普通模式
        String catFav=callStrategyClass.getFavoriteFoodByAnimalType("貓");
        String dogFav=callStrategyClass.getFavoriteFoodByAnimalType("狗");
        //打印
        System.out.println("catFav is:" + catFav);
        System.out.println("dogFav is:" + dogFav);


        System.out.println("分割線**************************************************************分割線");
        //策略模式
        //獲取不同種類動物喜歡吃的食物
        String dogFavoriteFood = callStrategyClass.callStrategy(new Dog());
        String catFavoriteFood = callStrategyClass.callStrategy(new Cat());

        //打印
        System.out.println("dogFavoriteFood is:" + dogFavoriteFood);
        System.out.println("catFavoriteFood is:" + catFavoriteFood);


    }
}

查看結果:


4、分析

通過TestClass中調用打印在控制檯上結果分析:

1、兩種方式都能夠實現需求

2、常規實現方式更加簡單,但是將很多內容暴露在外面

3、使用策略設計模式實現會更加更多的類,但是通過抽象接口、封裝不同實現類,體現了面向對象編程中封裝、多態思想,結構更加清晰,方便後期代碼維護。


發佈了105 篇原創文章 · 獲贊 35 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章