設計模式(六)---- 策略模式
阿新 • • 發佈:2018-12-08
策略模式(strategy)
策略模式對應於解決某一個問題的一個演算法族,允許使用者從該演算法族中任選一種演算法解決某一問題;同時,可以方便的更換演算法或增加新的演算法;並且由客戶決定呼叫哪個演算法。
1、提出問題:實現一個根據客戶型別獲取商品價格的方法,如下:
public class strategyDemo1 { public double getPrice(String type, double price) { if("普通客戶小批量".equals(type)) { System.out.println("不打折, 原價"); return price; } else if ("普通客戶大批量".equals(type)) { System.out.println("打九折"); return price * 0.9; } else if ("老客戶小批量".equals(type)) { System.out.println("打八五折"); return price * 0.85; }else if ("老客戶大批量".equals(type)) { System.out.println("打八折"); return price * 0.8; } else { return price; } } }
以上的實現比較基礎,能夠解決我們的問題,但是存在以下幾個問題:
(1)若型別比較多, 實現複雜時, 整個條件語句的程式碼就變得特別長, 難於維護;
(2)若新增型別, 則需要頻繁的修改程式碼, 這就違反了開閉原則;
2、為了解決以上問題,我們使用策略模式來實現;
策略模式的實現類圖,如下所示:
演算法的介面(Strategy),如下所示:
public interface Strategy
{
public double getPrice(double standardPrice);
}
新客戶小批量演算法類(NewCustomerFewStrategy ),如下所示:
public class NewCustomerFewStrategy implements Strategy
{
@Override
public double getPrice(double standardPrice)
{
System.out.println("不打折");
return standardPrice;
}
}
新客戶大批量演算法類(NewCustomerManyStrategy ),如下所示:
public class NewCustomerManyStrategy implements Strategy
{
@Override
public double getPrice(double standardPrice)
{
System.out.println("打九折");
return standardPrice * 0.9;
}
}
老客戶小批量演算法類(OldCustomerFewStrategy ),如下所示:
public class OldCustomerFewStrategy implements Strategy
{
@Override
public double getPrice(double standardPrice)
{
System.out.println("打八五折");
return standardPrice * 0.85;
}
}
老客戶大批量演算法類(OldCustomerManyStrategy ),如下所示:
public class OldCustomerManyStrategy implements Strategy
{
@Override
public double getPrice(double standardPrice)
{
System.out.println("打八折");
return standardPrice * 0.8;
}
}
Context實現類:將演算法和客戶直接分離了, 使得演算法可以獨立於客戶端的獨立變化
public class Context
{
private Strategy strategy; //當前採用的演算法
//使用構造器注入
public Context(Strategy strategy)
{
this.strategy = strategy;
}
public void printPrice(double s)
{
System.out.println("您該報價:" + strategy.getPrice(s));
}
}
測試類,如下所示:
public class TestStrategy
{
public static void main(String[] args)
{
//獲取新客戶大批量演算法
Strategy strategy = new NewCustomerManyStrategy();
Context context = new Context(strategy);
context.printPrice(1000);
}
}
結果如下:
打九折
您該報價:900.0