前後端雙端資料校驗(vue-Element、Bootstrap、JSR303校驗規範)
阿新 • • 發佈:2021-01-09
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]
折扣
拼團優惠
預定
原價
這樣改造的我們就要知道每個具體的行為策略是什麼 ,但是策略類會增多,所有策略類都需要對外暴露。
使用場景:
- 一個系統要動態的選擇一種演算法像上面案例一樣
- 如果一個物件有多個類,只是在乎物件的行為,可以用策略模式動態的去選擇一種去執行