1. 程式人生 > >設計模式(六)---- 策略模式

設計模式(六)---- 策略模式

策略模式(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