當你有很多計算方法,通常會將所以計算法則寫在同一個類別,但是當有新的演算法要加入時,你必須修改原來的程式,這種方式容易造成維護成本較高,如果把這些演算法抽離出來,提供統一個介面去實作,不僅擴充性高、可維護性也不錯。我們稱為策略模式。
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();
}
}
留言
張貼留言