策略模式用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得他們可以相互替換
一個系統需要動態地在幾種算法中選擇一種。那麼這些算法可以包裝到一個個的具體算法裏面,而這些具體算法類都是一個抽象算法類的子類。就是這些具體算法類均有統一的接口,由於多態性原則,客戶端可以選擇使用任何一個具體算法類,並只持有一個數據類型是抽象算法類的對象
如果在一個系統裏面有許多類,他們之間的區別僅在於他們的行爲,那麼使用策略模式可以動態地讓一個對象在許多行爲中選擇一種行爲
一個系統的算加法使用的數據不可以讓客戶端知道。策略模式可以避免讓客戶端涉及到不必要接觸到的只與算法有關的數據
如果一個對象有很多行爲,如果不用恰當的模式,這些行爲就只好使用多重的條件選擇語句來實現,這時可以考慮使用策略模式
import java.math.BigDecimal;
public interface DiscountStrategy {
public BigDecimal calculateDiscount();
}
import java.math.BigDecimal;
/**
* 固定1元折扣
*/
public class FlatRateStrategy implements DiscountStrategy {
private BigDecimal price;
public FlatRateStrategy(BigDecimal price) {
this.price = price;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
/**
* 策略方法
*/
public BigDecimal calculateDiscount() {
return new BigDecimal("1.00");
}
}
import java.math.BigDecimal;
/**
* 無折扣
*/
public class NoDiscountStrategy implements DiscountStrategy {
private BigDecimal price;
public NoDiscountStrategy(BigDecimal price) {
this.price = price;
}
/**
* 策略方法
*/
public BigDecimal calculateDiscount() {
return BigDecimal.ZERO.multiply(price);
}
}
import java.math.BigDecimal;
/**
* 2折折扣
*/
public class PercentageStrategy implements DiscountStrategy {
private BigDecimal percent;
private BigDecimal price;
public PercentageStrategy(BigDecimal percent, BigDecimal price) {
this.percent = percent;
this.price = price;
}
public BigDecimal getPercent() {
return percent;
}
public void setPercent(BigDecimal percent) {
this.percent = percent;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
/**
* 策略方法
*/
public BigDecimal calculateDiscount() {
return price.multiply(percent).setScale(2);
}
}
import java.math.BigDecimal;
public class Context {
private DiscountStrategy discountStrategy;
public Context(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public BigDecimal contextCalculate() {
return discountStrategy.calculateDiscount();
}
}
import java.math.BigDecimal;
public class Client {
public static void main(String[] args) {
DiscountStrategy noDiscountStrategy = new NoDiscountStrategy(new BigDecimal("88.00"));
DiscountStrategy flatRateStrategy = new FlatRateStrategy(new BigDecimal("88.00"));
DiscountStrategy percentageStrategy = new PercentageStrategy(new BigDecimal("0.20"),new BigDecimal("88.00"));
/**
* 無折扣
*/
Context noDiscountStrategyContext = new Context(noDiscountStrategy);
System.out.println(noDiscountStrategyContext.contextCalculate());
/**
* 固定1元折扣
*/
Context flatRateStrategyContext = new Context(flatRateStrategy);
System.out.println(flatRateStrategyContext.contextCalculate());
/**
* 2折折扣
*/
Context percentageStrategyContext = new Context(percentageStrategy);
System.out.println(percentageStrategyContext.contextCalculate());
}
}