java策略模式拙見
阿新 • • 發佈:2022-03-03
面向物件的兩個基本準則:
單一職責:一個類只有一個發生變化的原因
開閉原則:對拓展開放,對修改關閉
《Java開發手冊》中,有這樣的規則:超過3層的 if-else 的邏輯判斷程式碼可以使用衛語句、策略模式、狀態模式等來實現。
在程式碼中縱使採用if/else也可以達到要求,但是如果過度採用這種方式會導致程式碼極為複雜,後期維護及拓展相當困難。因此策略模式可以用來解決這種困擾
問:怎麼使用策略模式
首先明白,什麼是策略模式
:通過分割使用演算法、實現演算法主體進而拆除複雜繁瑣的if/else方法體的一種程式設計思想
策略模式的優點
1、降低了多重條件語句伴隨的維護難度高的問題
2、恰當的使用了繼承,減少了冗餘程式碼
3、貼合開閉原則,保證儘可能少對原始碼更改的前提新增了功能
策略模式的缺點
:隨著策略的不斷增多會導致策略類數量龐大(可通過混合模式解決)
實現的方式
1、定義公有策略介面IStrategyService及策略方法doOperation(Object arg)
2、根據需要採用的策略,實現策略介面,定義策略實現類StrategyServiceImpl
3、使用策略實現類
1 public class Context { 2 private Strategy strategy; 3 4 public Context(Strategy strategy){ 5 this.strategy = strategy; 6 } 7 8 public int executeStrategy(int num1, int num2){ 9 return strategy.doOperation(num1, num2); 10 } 11 }
1 public class StrategyPatternDemo { 2 public static void main(String[] args) { 3 Context context = new Context(new OperationAdd()); 4 System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); 5 6 context = new Context(new OperationSubtract()); 7 System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); 8 9 context = new Context(new OperationMultiply()); 10 System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); 11 } 12 }
現在,嘗試自己使用策略模式
使用場景,支付
支付方式可以有多種,包括支付寶、微信、銀行卡、信用卡......
場景滿足同一件事的不同完成方式
故不變一為“支付”,多變為“支付方式”。一變-支付寶、二變-微信、三變-銀行卡、四變-信用卡
首先,定義多變核心,萬變不離其宗-支付介面IPayService,定義介面中支付方式的方法名payMethod
1 package strategy; 2 3 public interface IPayService{ 4 int payMethod(double moneyCount); 5 }
多變實現
一變:支付寶
1 package strategy; 2 3 public class Alipay implements IPayService{ 4 public Alipay(){ 5 System.out.println("支付方式採用了支付寶"); 6 } 7 @Override 8 public int payMethod(double moneyCount){ 9 return 0; 10 } 11 12 }
二變:微信
1 package strategy; 2 3 public class WeChatpay implements IPayService{ 4 public WeChatpay(){ 5 System.out.println("支付方式採用了微信"); 6 } 7 @Override 8 public int payMethod(double moneyCount){ 9 System.out.println("支付方式採用了微信"); 10 return 1; 11 } 12 13 }
三變:銀行卡
1 package strategy; 2 3 public class BankCardpay implements IPayService{ 4 public BankCardpay(){ 5 System.out.println("支付方式採用了銀行卡"); 6 } 7 @Override 8 public int payMethod(double moneyCount){ 9 System.out.println("支付方式採用了銀行卡"); 10 return 0; 11 } 12 13 }
四變:信用卡
1 package strategy; 2 3 public class Paypalpay implements IPayService{ 4 public Paypalpay(){ 5 System.out.println("支付方式採用了信用卡"); 6 } 7 @Override 8 public int payMethod(double moneyCount){ 9 System.out.println("支付方式採用了信用卡"); 10 return 1; 11 } 12 13 }
不變實現:
1 package strategy; 2 3 public class BuySomething{ 4 private IPayService payService; 5 6 public BuySomething(IPayService payService){ 7 this.payService = payService; 8 } 9 10 public int payMoneyCount(double moneyCount){ 11 return payService.payMethod(moneyCount); 12 } 13 }
現在需要支付
1 package strategy; 2 3 public class Market{ 4 public static void main(String[] args){ 5 6 System.out.println("我選中了一件襯衫,老闆,多少錢??"); 7 double shirtPrice = 0; 8 System.out.println("哦~小夥子,襯衫的價格是9磅15便士!"); 9 shirtPrice = 9.15; 10 System.out.println("好的老闆!我並沒有攜帶現金,我將採用電子支付!"); 11 BuySomething buyShirt = new BuySomething(new WeChatpay()); 12 if(buyShirt.payMoneyCount(shirtPrice)>0){ 13 System.out.println("支付成功!"); 14 System.out.println("歡迎小夥子下次光臨!"); 15 }else{ 16 System.out.println("支付失敗!"); 17 System.out.println("哦,親愛的達瓦里氏!你的錢包餘額不足了嗎?"); 18 } 19 } 20 }
貼一下執行結果:
結果1:
結果2: