設計模式系列2 策略模式
阿新 • • 發佈:2018-12-12
什麼是策略模式
策略是對演算法的封裝,是一種形為模式,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。
策略模式和簡單工廠很相似,確有不同,策略是一種行為模式,而簡單工廠是建立型模式。
為什麼用策略模式/策略模式的好處
優點
- 是一種行為模式,對演算法封裝,使得客戶端獨立於各個策略。
- 擴充套件性強,新增策略無非就是新增一個具體的實現類而已,代價非常低。
缺點
- 客戶端必須知道所有的策略類,並自行決定使用哪個策略類。
- 造成很多的策略類
注:解決辦法:使用工廠模式
使用場景
原則
- 多個類只區別在表現行為不同,可以使用Strategy模式,在執行時動態選擇具體要執行的行為。
- 需要在不同情況下使用不同的策略(演算法),或者策略還可能在未來用其它方式來實現。
- 對客戶隱藏具體策略(演算法)的實現細節,彼此完全獨立。
如
- 圖書銷售演算法(不同書本折扣的演算法)
- 遊戲裡角色或武器的切換
- 自動售貨飲料機
- 十一旅遊乘車選擇
- …
例子(圖書銷售折扣程式碼實現)
建立一個Book介面。
public interface Book {
double discount();
}
建立實現Book介面的文學類實體類。
public class LiteratureBook implements Book { @Override public double discount() { return 0.30D; } }
建立實現Book介面的程式設計類實體類
public class ProgrammingBook implements Book {
@Override
public double discount() {
return 0.25D;
}
}
建立 Discount 類。用於動態獲取不同型別折扣,兩種方式
- 初始化
- setXXX()
public class Discount { Book book; public Discount(Book book) { this.book = book; } public double getDiscount() { return book.discount(); } public void setSoft(Book book) { this.book = book; } }
測試類
public static void main(String[] args) {
Discount discount = new Discount(new LiteratureBook());
System.out.println("文學類折扣:"+discount.getDiscount()*100+"%");
discount.setSoft(new ProgrammingBook());
System.out.println("程式設計類折扣:"+discount.getDiscount()*100+"%");
}
輸出結果:
文學類折扣:30.0%
程式設計類折扣:25.0%
總結
策略是一種行為模式,對演算法封裝,使得客戶端獨立於各個策略。
關鍵程式碼實現同一個介面。