策略模式

策略模式封裝了變化!!!

策略模式是一種定義一系列算法的方法,從概念上來看,所有這些算法完成相同的工作,只是實現不同,它可以以相同的方式調用所有的算法,減少了各種算法與使用之間耦合。

說得直白一點也就是將實現同一個功能的不同算法封裝在一起,客戶端不需要關心算法的實現,并且通過簡單的代碼調用即可。

在實際的App項目中,支付功能就可以通過此模式來進行封裝。支付的方式有很多種,比如微信支付、支付寶支付、銀聯支付...每種支付方式內部的實現都不相同,但是都是為了完成支付功能。每一種算法都可以認為是一種策略,每種策略都是為了完成支付這個功能,因此正好符合策略模式的主旨。

下面通過簡單的代碼來實現App支付功能:

  1. 支付接口(策略接口,定義所有支持的算法的公共方法):
    public interface AppPay {
    void pay(float money);
    }
  • 微信支付(策略一):
    public class WeChatPay implements AppPay {
    @Override
    public void pay(float money) {
    System.out.println("這是微信支付,支付的金額為:" + money);
    }
    }

  • 支付寶支付(策略二):
    public class AliPay implements AppPay {
    @Override
    public void pay(float money) {
    System.out.println("這是支付寶支付,支付金額為:" + money);
    }
    }

  • 銀聯支付(策略三):
    public class UnionPay implements AppPay {
    @Override
    public void pay(float money) {
    System.out.println("這是銀聯支付,支付金額為:" + money);
    }
    }

  • 配置一個Context上下文來維護AppPay對象的引用:
    public class AppPayContext {
    private AppPay appPay;
    public AppPayContext(AppPay appPay) {
    this.appPay = appPay;
    }
    public void pay(float money) {
    this.appPay.pay(money);
    }
    }

  • 客戶端調用代碼:
    public class Client {
    public static void main(String[] args) throws Exception {
    AppPayContext context = null;
    int payType = new Random().nextInt(100);
    switch (payType % 3) {
    case 1:
    context = new AppPayContext(new WeChatPay());
    break;
    case 2:
    context = new AppPayContext(new AliPay());
    break;
    case 3:
    context = new AppPayContext(new UnionPay());
    break;
    }
    if (context != null) {
    context.pay(100);
    }
    }
    }

從客戶端代碼上可以看到,客戶端不需要關心各種支付算法的具體實現,僅僅通過策略上下文進行間接調用即可。

以上代碼就是策略模式的簡單實現,為了簡化客戶端的調用代碼,可以結合抽象工廠以及反射來實現,代碼如下:

  • AppPayContext:
    public class AppPayContext {
    public static void pay(Class clazz, float money) throws Exception {
    AppPay appPay = (AppPay) clazz.newInstance();
    appPay.pay(money);
    }
    }

  • 客戶端調用代碼:
    public class Client {
    public static void main(String[] args) throws Exception {
    AppPayContext.pay(WeChat.class, 4000);
    //AppPayContext.pay(AliPay.class, 4000);
    //AppPayContext.pay(UnionPay.class, 4000);
    }
    }

策略模式的優點是簡化了單元測試,每種算法都有自己的類,可以單獨測試。也很利于擴展,添加一種支付方式的話,只需要添加一個算法類,客戶端直接調用就行,不需要做任何修改。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內容