策略模式

歐陽鋒買劍

  你們好,我是小趙,現任藏劍山莊高級鑄劍師。算法

  我鑄的劍質量都屬上層,不管是玄鐵重劍、屠龍刀、紫薇軟劍、三叉戟等等,只要江湖上排的上號的我幾乎都能作的出來,因此在圈內還算是小有名氣。設計模式

 

  今天朋友給我介紹了個私活,僱主是歐陽鋒,聽說是想打造一把神兵利器。ide

 

  「鋒哥,講一下你的需求吧。」函數

  「華山論劍在即,我要當天下第一!」。this

  「.......」 spa

 

  我感受這位峯哥是否是有點不正常,那乾脆我來引導一下需求吧,因而我問道:「峯哥是否是想要一把絕世好劍?」設計

  「不錯,小夥子很懂我!就要一把絕世好劍!」code

 

鋒哥的絕世好劍

  幾天以後,我打造出了這把絕世好劍:對象

public class JueShi {
    public void exec(){
        System.out.println("裝備絕世好劍!");
    }
}

 

  使用簡單,只須要調一下exec()方法就佩戴上了:blog

    public static void main(String[] args) {
        System.out.println("----- 歐陽鋒 -----");
        JueShi jueShi = new JueShi();
        jueShi.exec();
    }

 

輸出:

----- 歐陽鋒 -----
裝備絕世好劍!

 

  峯哥高高興興拿着絕世好劍回去。

 

  三天後,氣呼呼來找我了。

 

  「小趙!我這把絕世好劍,我拿去跟聶風打,跟嶽不羣打,都打贏了,怎麼跟我乾兒子打就打不贏!?」

  「你乾兒子?哪位啊?」

  「楊過啊!」

  我草,楊過用的是玄鐵重劍,這把絕世好劍確定打不過人家,那可怎麼辦?那能怎麼辦?天下武器環環相剋,不可能一把武器無敵天下。

 

華山論劍

  我心生一計,馬上說道:「峯哥,你看要不這樣,你多打造幾把神兵利器,實戰中根據對手的不一樣而更換不一樣的武器,保準打遍天下無敵手。」

  「好主意!我如今最忌憚的人就郭靖、洪七公、楊過三我的,郭靖用掌、洪七公用棍、楊過用劍,你只要保證我把這三個戰勝就好了。」

  生意談好以後,就開始設計開發了。

 

  個人策略很簡單:

  郭靖用掌,怕遠程,那就用小李飛刀對付他。

  洪七公用棍,選用倚天劍便可,削鐵如泥又不失靈活。

  楊過的玄鐵重劍?一把屠龍刀砍翻他!

 

  角色1:武器(小李飛刀、倚天劍、屠龍刀都是武器),也就是武器抽象和武器實體。

  角色2:峯哥,咱們這裏重點探討策略,因此峯哥就不存在了,當成主函數便可。

  動做:更換武器(也就是接收一個武器,而且佩戴)。

 

類圖很是的簡單:

 

  幾天後,峯哥來取劍。

 

武器抽象:

public interface IWeapon {
    void exec();//每把武器均可以佩戴
}

 

屠龍刀:

public class TuLong implements IWeapon{
    @Override
    public void exec() {
        System.out.println("帶上屠龍刀!");
    }
}

 

倚天劍:

public class Yitian implements IWeapon {
    @Override
    public void exec() {
        System.out.println("帶上倚天劍!");
    }
}

 

小李飛刀:

public class XiaoLiFeiDao implements IWeapon {
    @Override
    public void exec() {
        System.out.println("帶上小李飛刀!");
    }
}

 

上下文對象,負責維護對武器的引用:

public class Context {
    private IWeapon weapon;

    //傳入一把武器
    public Context(IWeapon weapon) {
        this.weapon = weapon;
    }
    //佩戴武器,分分鐘秒殺你
    public void exec(){
        this.weapon.exec();
    }
}

 

主函數:

    public static void main(String[] args) {
        System.out.println("華山論劍開始:");

        System.out.println("------歐陽鋒對郭靖------");
        Context context1 = new Context(new XiaoLiFeiDao());
        context1.exec();

        System.out.println("------歐陽鋒對洪七公------");
        Context context2 = new Context(new Yitian());
        context2.exec();

        System.out.println("------歐陽鋒對楊過------");
        Context context3 = new Context(new TuLong());
        context3.exec();
    }

 

輸出:

華山論劍開始:
------歐陽鋒對郭靖------
帶上小李飛刀!
------歐陽鋒對洪七公------
帶上倚天劍!
------歐陽鋒對楊過------
帶上屠龍刀!

 

  華山論劍是二十年一度的江湖奧運會,各個電視臺都在同步直播,在直播裏,我看到了峯哥意氣風發,遇神殺神,遇佛殺佛,最終得到了天下第一的稱號。

 

策略模式

  給峯哥設計的這套程序,使用了策略模式,這是一個相對於比較簡單的設計模式。

  策略模式:它定義了算法家族,分別封裝起來,讓它們之間能夠互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。

 

  策略模式的三個角色:

  Context封裝角色,也叫作上下文角色,起到封裝做用,屏蔽高層模塊對策略的直接訪問。

  策略抽象角色,讓每一個策略實現的接口。

  具體策略角色,實現抽象策略接口,並實現具體的算法內容。

 

  策略模式的優勢在於策略能夠自由切換,而且擴展性很好,若是要增長一個新策略,只須要實現策略抽象接口便可。

 

  當一個業務須要多種算法自由切換的時候,而且但願屏蔽算法的具體內容,只須要調用一下即獲取結果,則優先考慮策略模式。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息