當你有很多計算方法,通常會將所以計算法則寫在同一個類別,但是當有新的演算法要加入時,你必須修改原來的程式,這種方式容易造成維護成本較高,如果把這些演算法抽離出來,提供統一個介面去實作,不僅擴充性高、可維護性也不錯。我們稱為策略模式。
github: https://github.com/blackbryant/designpattern/tree/master/java/src/design/stragety
策略模式定義
策略模式將多個演算法則定義一個介面,並把每個演算法封裝,方便擴展和使用
策略模式用法
- 多個處理方法或演算法(例如排序: 選擇排序、泡沫排序、插入排序) 2.業務邏輯中有類似行為但是使用的方法不同
策略模式例子
我們利用進銷存拋帳為例子,當銷售作業、入庫作業、退貨作業都需要拋帳時,我們可以做一個共同介面為TradeStragety讓各作業來實作拋帳規則。因為對各作業拋帳是共同一個行為,但是實作方法不同。
- 首先定義一個拋帳介面,當入庫、銷售和退貨當完成程序時,會將做最後帳務拋轉。
/** * Name: TradeStragety.java * Description : 拋帳策略模式-介面 * Created by bryant on 2017/1/14. */ public interface TradeStragety { //拋帳 public boolean doTrade(); }
- 銷售拋障實作TradeStragety介面來完成拋帳
/** * Name: SaleTradeStragety.java * Description : 銷售拋帳 * Created by bryant on 2017/1/14. */ public class SaleTradeStragety implements TradeStragety{ @Override public boolean doTrade() { System.out.println("銷售拋帳成功"); return true; } }
- 入庫拋帳實作TradeStragety介面來完成拋帳
/** * Name: EnterTradeStragety.java * Description : 入庫拋帳 * Created by bryant on 2017/1/14. */ public class EnterTradeStragety implements TradeStragety{ @Override public boolean doTrade() { System.out.println("入庫拋帳成功"); return true; } }
- 退貨拋帳實作TradeStragety介面來完成拋帳
/** * Name: ReturnTradeStragety.java * Description : 退貨拋帳 * Created by bryant on 2017/1/14. */ public class ReturnTradeStragety implements TradeStragety{ @Override public boolean doTrade() { System.out.println("退貨拋帳成功"); return true; } }
- 策略模式Demo
/** * Name: TradeStragetyDemo.java * Description : 策略模式-Demo * Created by bryant on 2017/1/14. */ public class TradeStragetyDemo { private TradeStragety tradeStragety ; public TradeStragetyDemo(TradeStragety tradeStragety){ this.tradeStragety = tradeStragety ; } public void doTrade(){ this.tradeStragety.doTrade(); } public static void main(String[] args){ TradeStragetyDemo saleDemo = new TradeStragetyDemo(new SaleTradeStragety()); saleDemo.doTrade(); TradeStragetyDemo returnDemo = new TradeStragetyDemo(new ReturnTradeStragety()); returnDemo.doTrade(); } }
留言
張貼留言