1. 程式人生 > 其它 >java策略模式拙見

java策略模式拙見

面向物件的兩個基本準則:

單一職責:一個類只有一個發生變化的原因

開閉原則:對拓展開放,對修改關閉

《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: