1. 程式人生 > >設計模式:策略模式

設計模式:策略模式

urn gyb 能夠 數據庫 ret 它的 RF 可擴展 優惠

1. 模式的定義

假設現在要實現一個簡化的報價管理,實現如下的功能:
1. 對於普通客戶或者新客戶報全價
2. 對於老客戶報的價格,統一折扣5%
3. 對於大客戶報的價格,統一折扣10%
對不同的人員報不同的價格

到底該如何實現,才能夠讓價格類中的計算報價的算法,能很容易地實現可維護,可擴展,又能動態地切換變化呢?

策略模式的定義:
定義一系列的算法,把它們一個個封裝起來,並且使它們可相互替換,使得算法可獨立於使用它的客戶而變化.
2 實現
Strategy:策略接口,用來約束一系列具體的策略算法,Context使用這個接口來調用具體的策略實現定義的算法

ConcreteStrategy:具體的策略實現,也就是具體的算法實現

代碼:
public interface Strategy {
double calcPrice(double price);
}
public class ConcreteStrategyA implements Strategy {

@Override
public double calcPrice(double price) {
System.out.println("對於新客戶和普通客戶沒有優惠");
return price;
}
}
public class ConcreteStrategyB implements Strategy {
@Override
public double calcPrice(double price) {
System.out.println("對於老客戶統一折扣5%");
return price*(1-0.05);
}
}
public class ConcreteStrategyC implements Strategy {
@Override
public double calcPrice(double price) {
System.out.println("對於大客戶統一折扣10%");
return price*(1-0.1);
}
}
public class PriceManger {
private Strategy strategy;

public PriceManger(Strategy strategy) {
this.strategy = strategy;
}
public double calcPrice(double price){
return strategy.calcPrice(price);
}
}
main方法測試
Strategy strategy = new ConcreteStrategyC();
PriceManger priceManger = new PriceManger(strategy);
double goodprice = priceManger.calcPrice(10000);
System.out.println(goodprice);
策略模式結合模板方法模式
發現一系列的算法的實現上存在公共功能,只是在某些局部步驟上有所不同
代碼:
public interface LogStrategy {
public void log(String msg);
}
public abstract class LogStrategyTemplate implements LogStrategy{
public final void log(String msg) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mmm:ss");
msg =df.format(new Date())+"內容是"+ msg;
this.dolog(msg);
}
public abstract void dolog(String msg);

}
public class DbLog extends LogStrategyTemplate {
@Override
public void dolog(String msg) {
System.out.println("將以下信息保存到數據庫"+msg);
}
}
public class FileLog extends LogStrategyTemplate {
@Override
public void dolog(String msg) {
System.out.println("將數據保存到文件中"+msg);
}
}
main方法測試
LogStrategy strategy = new DbLog();
strategy.log("這是一個策略模式和模板方法模式結合的案例");

設計模式:策略模式