1. 程式人生 > 實用技巧 >前後端雙端資料校驗(vue-Element、Bootstrap、JSR303校驗規範)

前後端雙端資料校驗(vue-Element、Bootstrap、JSR303校驗規範)

技術標籤:設計模式設計模式java

1、什麼是策略模式
我們要出一次遠門我們有多種交通方式,每一種方式都是一種策略,我們支付買東西,WX ,zfb ,yl 我們選著沒哪個,就是一個策略

意圖:將演算法封裝成一個演算法中,讓每個演算法可以相互替換。
主要解決: 多種演算法相似的情況下避免了很多的 if else

其中,Context是上下文,用一個ConcreteStrategy來配置,維護一個對Strategy物件的引用,
Strategy是策略類,用於定義所有支援演算法的公共介面;ConcreteStrategy是具體策略類,封裝了具體的演算法或行為,繼承於Strategy。

1. Context上下文


  Context上下文角色,也叫Context封裝角色,起承上啟下的作用,遮蔽高層模組對策略、演算法的直接訪問,封裝可能存在的變,上下文呼叫各種演算法到底執行什麼,
2. 策略角色
  Strategy:抽象策略角色,是對策略、演算法家族的抽象,通常為介面,定義每個策略或演算法必須具有的方法和屬性,即抽象策略角色規定演算法統一行為,
3. 具體策略角色
  用於實現抽象策略中的操作
1. 上下文類
它起到承上啟下的作用,具體的執行哪個演算法

public class Context {

    private   Strategy strategy;

    public Context
(Strategy strategy) { this.strategy = strategy; } public void exeCon() { strategy.CashSuper(); } }

2. 策略角色
也為抽象類,定義一個介面或者,抽象類,抽出方法供子類使用,抽象策略角色規定演算法統一行為,

public interface Strategy  {
    void  CashSuper();
}

3.具體的策略角色
具體封裝的演算法

public class BooKing implements Strategy
{ @Override public void CashSuper() { System.out.println("預定"); } }
public class Discount implements Strategy {
    @Override
    public void CashSuper() {
        System.out.println("折扣");
    }
}

public class Original implements Strategy {
    @Override
    public void CashSuper() {
        System.out.println("原價");
    }
}


public class PinTuan implements Strategy {
    @Override
    public void CashSuper() {
        System.out.println("拼團優惠");
    }
}

4.測試類

public class TestStr {
    public static void main(String[] args) {
        Context context = new Context(new BooKing());
        context.exeCon();
    }
}

在這裡插入圖片描述
這樣實現一個簡單地策略但是我們要呼叫哪一個策略我們還有要用 if else 去判斷,我們把上下文改造一下,這樣我們實現一個工廠以後的擴充套件只需要維護這個Context的擴充套件就可以了

public class ContextFac {
    private static Map<String,Strategy> map = new HashMap<String, Strategy>();
    private static final Strategy original = new Original();//預設沒有優惠
    static {
        //把所有的具體策略角色放到map裡面
       map.put(PromoKey.BooKing,new BooKing());
       map.put(PromoKey.Discount,new Discount());
       map.put(PromoKey.Original,new Original());
       map.put(PromoKey.PinTuan,new PinTuan());
   }
    private ContextFac() {

    }
 
    //根據傳過來的key是執行
    public static Strategy getPromoKey(String key){
        Strategy strategy = map.get(key);
        return strategy == null ? original : strategy;
    }

    //內部類定義
    private interface PromoKey{
        String BooKing="BooKing";
        String Discount="Discount";
        String Original="Original";
        String PinTuan="PinTuan";
    }

//得到所有key,可以返回到頁面上,供使用者選擇
    public static Set<String> getPromotionKeys(){
        return map.keySet();
    }

}

測試類

public class TestStr {
    public static void main(String[] args) {
    //得到所有的key
      Set<String> promotionKeys = getPromotionKeys();
        System.out.println(promotionKeys);
        for (String promotionKey : promotionKeys) {
            Strategy promoKey = getPromoKey(promotionKey);
            promoKey.CashSuper();
        }

測試結果

[Discount, PinTuan, BooKing, Original]
折扣
拼團優惠
預定
原價

在這裡插入圖片描述
這樣改造的我們就要知道每個具體的行為策略是什麼 ,但是策略類會增多,所有策略類都需要對外暴露。
使用場景:

  1. 一個系統要動態的選擇一種演算法像上面案例一樣
  2. 如果一個物件有多個類,只是在乎物件的行為,可以用策略模式動態的去選擇一種去執行