把具體的算法實現從業務邏輯中剝離出來,成爲一系列獨立算法類,使得它們可以相互替換
1、創建接口
//攻取西川的策略
public interface IOccupationStrategyWestOfSiChuan {
public void occupationWestOfSiChuan(String msg);
}
2、創建接口的三個實現
//攻取西川的上上計策
public class UpperStrategy implements IOccupationStrategyWestOfSiChuan {
@Override
public void occupationWestOfSiChuan(String msg) {
if (msg == null || msg.length() < 5) {
//故意設置障礙,導致上上計策失敗
System.out.println("由於計劃泄露,上上計策失敗!");
int i = 100/0;
}
System.out.println("挑選精兵,晝夜兼行直接偷襲成都,可以一舉而定,此爲上計計也!");
}
}
//攻取西川的中計策
public class MiddleStrategy implements IOccupationStrategyWestOfSiChuan {
@Override
public void occupationWestOfSiChuan(String msg) {
System.out.println("楊懷、高沛是蜀中名將,手下有精銳部隊,而且據守關頭,我們可以裝作要回荊州,引他們輕騎來見,可就此將其擒殺,而後進兵成都,此爲中計。");
}
}
//攻取西川的下計策
public class LowerStrategy implements IOccupationStrategyWestOfSiChuan {
@Override
public void occupationWestOfSiChuan(String msg) {
System.out.println("退還白帝,連引荊州,慢慢進圖益州,此爲下計。");
}
}
3、上下文策略
//攻取西川參謀部,就是上下文啦,由上下文來選擇具體的策略
public class OccupationContext {
public void occupationWestOfSichuan(String msg){
//先用上上計策
IOccupationStrategyWestOfSiChuan strategy = new UpperStrategy();
try {
strategy.occupationWestOfSiChuan(msg);
} catch (Exception e) {
//上上計策有問題行不通之後,用中計策
strategy = new MiddleStrategy();
strategy.occupationWestOfSiChuan(msg);
}
}
}
4、客戶端測試類
//此時外部客戶端相當於劉備了,不管具體採用什麼計策,只要結果(成功的攻下西川)
public class Client {
public static void main(String[] args) {
OccupationContext context = new OccupationContext();
//這個給手下的人激勵不夠啊
context.occupationWestOfSichuan("拿下西川");
System.out.println("=========================");
//這個人人有賞,讓士兵有動力啊
context.occupationWestOfSichuan("拿下西川之後,人人有賞!");
}
}
控制檯輸出:
由於計劃泄露,上上計策失敗!
楊懷、高沛是蜀中名將,手下有精銳部隊,而且據守關頭,我們可以裝作要回荊州,引他們輕騎來見,可就此將其擒殺,而後進兵成都,此爲中計。
------------------------------------------------
挑選精兵,晝夜兼行直接偷襲成都,可以一舉而定,此爲上計計也!