1. 程式人生 > >設計模式(二)策略模式2

設計模式(二)策略模式2

 看了武哥的策略模式,感覺真是易懂哈

   策略模式在實際中使用的還是挺多的,先來看一個場景:某個市場人員接到單兒後的報價策略,保價策略很複雜,但是可以簡單做如下歸類:

新客戶小批量報價  新客戶大批量報價  老客戶小批量報價  老客戶大批量報價

  具體選用哪個報價策略,這需要根據實際情況來確定,這時候採用策略模式即可解決這個問題。這個問題中,如果我們不採用策略模式會怎樣處理呢?很自然的會想到使用if判斷,或者switch…case…來解決,根據不同的使用者確定不同的報價。類似於如下的結構:

public double getPrice(String type, double price) {

    if(type.equals("新客戶小批量")) {
        // 處理報價邏輯
        return price;
    } else if(type.equals("新客戶大批量")) {
        // 處理報價邏輯
        return price;
    } 
    //......
}

  或者使用switch….case….,但是很明顯有個弊端,這個型別特別多,而且每個型別裡面還有自己的演算法,如果演算法比較複雜的話整個條件的控制程式碼會變得很長,難以維護。為了解決這個問題,我們可以使用策略模式。    策略模式:即對應於解決某一個問題的一個演算法族,允許使用者從該演算法族中人選個一個演算法解決某一問題,同時可以方便的更換演算法或者增加新的演算法,並且由客戶端決定呼叫哪個演算法,可以如下的示意圖:      首先有個策略的介面,然後不同的四個不同的策略分別實現這個介面中的方法,在這裡是報價的方法,然後定義一個上下文類,用來操作具體的具體的策略,客戶端只需要與這個上下文打交道即可,即只要將策略傳給上下文類,就可以執行相應的策略,後期如果需要修改或者新增,只需要修改具體的策略實現類或者新新增一個實現類即可,便於維護。下面來看下程式的實現。//策略介面

public interface Strategy {

    public double getPrice(double standardPrice);

}

四個不同的策略實現類:

// 新客戶小批量
public class NewCustomerFewStrategy implements Strategy {

    @Override
    public double getPrice(double standardPrice) {

        System.out.println("新客戶小批量,不打折");
        return standardPrice;
    }

}

// 新客戶大批量
public class NewCustomerManyStrategy implements Strategy {

    @Override
    public double getPrice(double standardPrice) {

        System.out.println("新客戶大批量,打九折");
        return standardPrice * 0.9;
    }

}

// 老客戶小批量
public class OldCustomerFewStrategy implements Strategy {

    @Override
    public double getPrice(double standardPrice) {

        System.out.println("老客戶小批量,打八折");
        return standardPrice * 0.8;
    }

}

// 老客戶大批量
public class OldCustomerManyStrategy implements Strategy {

    @Override
    public double getPrice(double standardPrice) {

        System.out.println("老客戶大批量,打八折");
        return standardPrice * 0.7;
    }

}

然後就是上下文類了:

/**
 * @Description 負責和具體的策略互動,具體的演算法和直接的客戶端分離。
 * @author Ni Shengwu
 *
 */
public class Context {

    private Strategy strategy;

    // 通過構造方法注入具體的策略,如果用Spring,就可以直接使用@Resource來注入了
    public Context(Strategy strategy) {
        super();
        this.strategy = strategy;
    }

    public void getPrice(double standardPrice) {
        System.out.println("報價為:" + strategy.getPrice(standardPrice));
    }

}

測試一下:

public class Client {

    public static void main(String[] args) {

        Strategy s1 = new OldCustomerManyStrategy();
        Context ctx = new Context(s1); //通過構造方法注入策略

        ctx.getPrice(1000);
    }

}

輸出結果為:

老客戶大批量,打八折 
報價為:700.0

在實際中,策略模式在spring中也有用到,通過註解@Resource就是使用該模式,注入哪個就使用哪個。  ---------------------  作者:eson_15  原文:https://blog.csdn.net/eson_15/article/details/52119001  版權宣告:本文為博主原創文章,轉載請附上博文連結!