一、策略設計模式定義
策略設計模式是指對一系列算法的定義,並將每一個算法封裝起來,而且使他們還可以相互替換。策略設計模式讓算法獨立於他的客戶而獨立變化。
二、使用情況
三、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、使用策略設計模式實現會更加更多的類,但是通過抽象接口、封裝不同實現類,體現了面向對象編程中封裝、多態思想,結構更加清晰,方便後期代碼維護。