設計模式系列之策略模式

一 策略模式的本質
策略模式的本質是一個接口有多個實現類,而每種實現類會處理某一種情況。
public interface PrizeSender {

/**

  • 用於判斷當前實例是否支持當前獎勵的發放
    */
    boolean support(SendPrizeRequest request);

/**

  • 發放獎勵
    */
    void sendPrize(SendPrizeRequest request);

}
該接口中主要有兩個方法:support()和sendPrize(),其中support()方法主要用於判斷各個子類是否支持當前類型數據的處理,而sendPrize()則主要是用於進行具體的業務處理的,比如這裏獎勵的發放。下面就是我們三種不同類型的獎勵發放的具體代碼:
// 積分發放
@Component
public class PointSender implements PrizeSender {

@Override
public boolean support(SendPrizeRequest request) {
return request.getPrizeType() == PrizeTypeEnum.POINT;
}

@Override
public void sendPrize(SendPrizeRequest request) {
System.out.println(“發放積分”);
}
}
// 虛擬幣發放
@Component
public class VirtualCurrencySender implements PrizeSender {

@Override
public boolean support(SendPrizeRequest request) {
return PrizeTypeEnum.VIRTUAL_CURRENCY == request.getPrizeType();
}

@Override
public void sendPrize(SendPrizeRequest request) {
System.out.println(“發放虛擬幣”);
}
}
// 現金髮放
@Component
public class CashSender implements PrizeSender {

@Override
public boolean support(SendPrizeRequest request) {
return PrizeTypeEnum.CASH == request.getPrizeType();
}

@Override
public void sendPrize(SendPrizeRequest request) {
System.out.println(“發放現金”);
}
}
這裏可以看到,在每種子類型中,我們只需要在support()方法中通過request的某個參數來控制當前request是否是當前實例能夠處理的類型,如果是,則外層的控制邏輯就會將request交給當前實例進行處理。關於這個類的設計,有幾個點需要注意:
使用@Component註解對當前類進行標註,將其聲明爲Spring容器所管理的一個bean;
聲明一個返回boolean值的類似於support()的方法,通過這個方法來控制當前實例是否爲處理目標request的實例;
聲明一個類似於sendPrize()的方法用於處理業務邏輯,當然根據各個業務的不同聲明的方法名肯定是不同的,這裏只是一個對統一的業務處理的抽象;
無論是support()方法還是sendPrize()方法,都需要傳一個對象進行,而不是簡簡單單的基本類型的變量,這樣做的好處是後續如果要在Request中新增字段,那麼就不需要修改接口的定義和已經實現的各個子類的邏輯;
2. 工廠方法模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章