你們好,我是小趙,現任藏劍山莊高級鑄劍師。算法
我鑄的劍質量都屬上層,不管是玄鐵重劍、屠龍刀、紫薇軟劍、三叉戟等等,只要江湖上排的上號的我幾乎都能作的出來,因此在圈內還算是小有名氣。設計模式
今天朋友給我介紹了個私活,僱主是歐陽鋒,聽說是想打造一把神兵利器。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封裝角色,也叫作上下文角色,起到封裝做用,屏蔽高層模塊對策略的直接訪問。
策略抽象角色,讓每一個策略實現的接口。
具體策略角色,實現抽象策略接口,並實現具體的算法內容。
策略模式的優勢在於策略能夠自由切換,而且擴展性很好,若是要增長一個新策略,只須要實現策略抽象接口便可。
當一個業務須要多種算法自由切換的時候,而且但願屏蔽算法的具體內容,只須要調用一下即獲取結果,則優先考慮策略模式。