精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

規則執行器:告別冗余IF判斷,讓代碼更優雅高效

開發 前端
針對這個需求,我首先梳理了一下咱們規則執行器大概的設計, 然后我設計了一個 V1 版本和大家一起分享一下,如果大家也有這樣的 case 可以給我分享留言,下面部分主要是設計和實現的流程和 code。

最近公司有個小需求,需要對之前已有的試用用戶申請規則進行拓展。我們的場景大概如下所示:

if (是否海外用戶) {
 return false;
}

if (刷單用戶) {
  return false;
}

if (未付費用戶 && 不再服務時段) {
  return false
}

if (轉介紹用戶 || 付費用戶 || 內推用戶) {
  return true;
}

按照上述的條件我們可以得出的結論是:

  1. 咱們的的主要流程主要是基于and 或者or 的關系。
  2. 如果有一個不匹配的話,其實咱們后續的流程是不用執行的,就是需要具備一個短路的功能。
  3. 對于目前的現狀來說,我如果在原有的基礎上來改,只要稍微注意一下解決需求不是很大的問題,但是說后面可維護性非常差。

后面經過權衡過后,我還是決定將這個部分進行重構一下。

規則執行器

針對這個需求,我首先梳理了一下咱們規則執行器大概的設計, 然后我設計了一個 V1 版本和大家一起分享一下,如果大家也有這樣的 case 可以給我分享留言,下面部分主要是設計和實現的流程和 code。

規則執行器的設計

規則處理邏輯優化規則處理邏輯優化

對于規則的抽象并實現規則

// 業務數據
@Data
public class RuleDto {
  private String address;
 private int age;
}

// 規則抽象
public interface BaseRule {

    boolean execute(RuleDto dto);
}

// 規則模板
public abstract class AbstractRule implements BaseRule {

    protected <T> T convert(RuleDto dto) {
        return (T) dto;
    }

    @Override
    public boolean execute(RuleDto dto) {
        return executeRule(convert(dto));
    }
  
    protected <T> boolean executeRule(T t) {
        return true;
    }
}

// 具體規則- 例子1
public class AddressRule extends AbstractRule {

    @Override
    public boolean execute(RuleDto dto) {
        System.out.println("AddressRule invoke!");
        if (dto.getAddress().startsWith(MATCH_ADDRESS_START)) {
            return true;
        }
        return false;
    }
}

// 具體規則- 例子2
public class NationalityRule extends AbstractRule {

    @Override
    protected <T> T convert(RuleDto dto) {
        NationalityRuleDto nationalityRuleDto = new NationalityRuleDto();
        if (dto.getAddress().startsWith(MATCH_ADDRESS_START)) {
            nationalityRuleDto.setNationality(MATCH_NATIONALITY_START);
        }
        return (T) nationalityRuleDto;
    }


    @Override
    protected <T> boolean executeRule(T t) {
        System.out.println("NationalityRule invoke!");
        NationalityRuleDto nationalityRuleDto = (NationalityRuleDto) t;
        if (nationalityRuleDto.getNationality().startsWith(MATCH_NATIONALITY_START)) {
            return true;
        }
        return false;
    }
}

// 常量定義
public class RuleConstant {
    public static final String MATCH_ADDRESS_START= "北京";
    public static final String MATCH_NATIONALITY_START= "中國";
}

執行器構建

public class RuleService {

    private Map<Integer, List<BaseRule>> hashMap = new HashMap<>();
    private static final int AND = 1;
    private static final int OR = 0;

    public static RuleService create() {
        return new RuleService();
    }


    public RuleService and(List<BaseRule> ruleList) {
        hashMap.put(AND, ruleList);
        return this;
    }

    public RuleService or(List<BaseRule> ruleList) {
        hashMap.put(OR, ruleList);
        return this;
    }

    public boolean execute(RuleDto dto) {
        for (Map.Entry<Integer, List<BaseRule>> item : hashMap.entrySet()) {
            List<BaseRule> ruleList = item.getValue();
            switch (item.getKey()) {
                case AND:
                    // 如果是 and 關系,同步執行
                    System.out.println("execute key = " + 1);
                    if (!and(dto, ruleList)) {
                        return false;
                    }
                    break;
                case OR:
                    // 如果是 or 關系,并行執行
                    System.out.println("execute key = " + 0);
                    if (!or(dto, ruleList)) {
                        return false;
                    }
                    break;
                default:
                    break;
            }
        }
        return true;
    }

    private boolean and(RuleDto dto, List<BaseRule> ruleList) {
        for (BaseRule rule : ruleList) {
            boolean execute = rule.execute(dto);
            if (!execute) {
                // and 關系匹配失敗一次,返回 false
                return false;
            }
        }
        // and 關系全部匹配成功,返回 true
        return true;
    }

    private boolean or(RuleDto dto, List<BaseRule> ruleList) {
        for (BaseRule rule : ruleList) {
            boolean execute = rule.execute(dto);
            if (execute) {
                // or 關系匹配到一個就返回 true
                return true;
            }
        }
        // or 關系一個都匹配不到就返回 false
        return false;
    }
}

執行器的調用

public class RuleServiceTest {

    @org.junit.Test
    public void execute() {
        //規則執行器
        //優點:比較簡單,每個規則可以獨立,將規則,數據,執行器拆分出來,調用方比較規整
        //缺點:數據依賴公共傳輸對象 dto

        //1. 定義規則  init rule
        AgeRule ageRule = new AgeRule();
        NameRule nameRule = new NameRule();
        NationalityRule nationalityRule = new NationalityRule();
        AddressRule addressRule = new AddressRule();
        SubjectRule subjectRule = new SubjectRule();

        //2. 構造需要的數據 create dto
        RuleDto dto = new RuleDto();
        dto.setAge(5);
        dto.setName("張三");
        dto.setAddress("北京");
        dto.setSubject("數學");;

        //3. 通過以鏈式調用構建和執行 rule execute
        boolean ruleResult = RuleService
                .create()
                .and(Arrays.asList(nationalityRule, nameRule, addressRule))
                .or(Arrays.asList(ageRule, subjectRule))
                .execute(dto);
        System.out.println("this student rule execute result :" + ruleResult);
    }
}

總結

規則執行器的優點和缺點

  • 優點:

比較簡單,每個規則可以獨立,將規則,數據,執行器拆分出來,調用方比較規整;

我在 Rule 模板類中定義 convert 方法做參數的轉換這樣可以能夠,為特定 rule 需要的場景數據提供拓展。

  • 缺點:上下 rule 有數據依賴性,如果直接修改公共傳輸對象 dto 這樣設計不是很合理,建議提前構建數據。
責任編輯:武曉燕 來源: 一安未來
相關推薦

2025-04-21 17:55:25

2022-04-10 10:41:17

ESLint異步代碼

2020-04-03 14:55:39

Python 代碼編程

2022-03-08 06:41:35

css代碼

2024-07-30 14:09:19

裝飾器Python代碼

2024-08-09 08:55:43

if執行器版本

2025-05-29 08:35:39

Python代碼開發

2025-02-10 00:25:00

命令模式擴展機制系統

2025-07-21 05:00:00

if-elseV1版本

2023-11-23 13:50:00

Python代碼

2019-09-29 16:17:25

Java代碼性能編程語言

2025-01-27 00:48:12

Java 8代碼接口

2024-12-10 08:00:00

C++CRTP函數

2024-05-24 10:51:51

框架Java

2024-12-03 16:36:08

事件總線C#代碼

2022-11-18 08:32:23

spring參數解析器

2022-03-11 12:14:43

CSS代碼前端

2022-04-29 08:41:40

開發應用程序執行器

2024-09-18 00:15:58

2024-02-23 08:57:42

Python設計模式編程語言
點贊
收藏

51CTO技術棧公眾號

最新中文字幕av| 成年人免费在线播放| 精品国产无码一区二区| 黑人一区二区三区四区五区| 日韩电影免费观看中文字幕| av网址在线观看免费| 在线观看免费版| 国产91在线观看丝袜| 欧美亚洲日本网站| 亚洲熟女毛茸茸| 第四色中文综合网| 91激情五月电影| 黄色小视频大全| 欧美在线观看在线观看| 精品一区二区免费在线观看| 97视频在线观看免费| 成人免费视频入口| 看全色黄大色大片免费久久久| 欧洲视频一区二区| 欧美中文字幕在线观看视频| 二区三区在线| 成人禁用看黄a在线| 国产精品色午夜在线观看| 久久久久久久蜜桃| 久久一区91| 日韩经典中文字幕在线观看| 97超碰人人看| 日本成人片在线| 亚洲午夜免费电影| 免费看啪啪网站| 九色在线视频蝌蚪| 成人丝袜视频网| 成人黄色免费看| 波多野结衣家庭主妇| 在线成人亚洲| 蜜月aⅴ免费一区二区三区| 丰腴饱满的极品熟妇| 国产精品任我爽爆在线播放| 欧美精品第一页| 欧美牲交a欧美牲交aⅴ免费真| 91三级在线| 国产精品传媒入口麻豆| 日韩av图片| 无码国精品一区二区免费蜜桃| 国产精品一区免费在线观看| 国产精品视频一| 五月婷婷激情视频| 国产精品日韩| 97精品在线视频| 国产精品18p| 欧美日韩影院| 欧美精品在线极品| 性色av无码久久一区二区三区| 精品国产a一区二区三区v免费| 日韩av在线播放资源| 95视频在线观看| 永久免费精品视频| 欧美刺激午夜性久久久久久久| 日本一二三四区视频| 四虎精品在线观看| 欧美日韩mp4| 中文字幕 日韩 欧美| 国产成人久久精品麻豆二区| 欧美日韩激情一区| 日韩成人精品视频在线观看| 激情久久一区二区| 欧美日韩一级片在线观看| 日本不卡一区二区在线观看| 欧美成人毛片| 91精品国产综合久久福利软件| 亚洲精品视频三区| 日本99精品| 亚洲国产福利在线| 国产精品无码网站| 激情五月色综合国产精品| 国产香蕉精品视频一区二区三区| 欧洲女同同性吃奶| 久久福利综合| 久久手机免费视频| 青娱乐在线视频免费观看| 欧美日韩影院| 7m精品福利视频导航| 欧美一区二区三区四| 久久夜色精品| 国产在线观看一区二区三区| 国产偷拍一区二区| 成人国产精品免费观看| 欧美日韩在线播放一区二区| 四虎久久免费| 亚洲一区在线视频| 国产福利视频在线播放| 国产一区精品福利| 日韩亚洲欧美综合| jizz欧美性20| 欧美高清视频手机在在线| 九九九久久久久久| 亚洲大片免费观看| 国产一区二区毛片| 蜜桃传媒视频麻豆一区| 婷婷成人激情| 黄色一区二区在线| 超碰超碰在线观看| 久久影院资源站| 中文字幕欧美亚洲| 国产成人愉拍精品久久| 美女免费视频一区| 精品国产一区二区三区麻豆免费观看完整版| 欧美色视频免费| 亚洲精品日日夜夜| 欧美伦理视频在线观看| 1313精品午夜理伦电影| 国产亚洲人成a一在线v站| 久久网中文字幕| 秋霞av亚洲一区二区三| 国产精品成人观看视频免费| av在线资源网| 精品日韩美女的视频高清| 思思久久精品视频| 蜜臀91精品国产高清在线观看| 久久夜色精品亚洲噜噜国产mv| 久久久久久少妇| 国产成人av一区二区三区在线 | 青青在线免费视频| 日韩三区在线| 亚洲精品国产欧美| 久久老司机精品视频| 麻豆精品国产91久久久久久| 久久99精品国产99久久| 中文字幕免费高清电视剧网站在线观看| 色狠狠色噜噜噜综合网| 国产午夜在线一区二区三区| 亚洲成av人电影| 国产精品电影网站| 久久久久久青草| 岛国精品视频在线播放| 无码国产精品一区二区免费式直播| 91av精品| 91精品在线看| 91青青在线视频| 欧美在线观看你懂的| 国产aⅴ激情无码久久久无码| 亚洲人体偷拍| 国产欧美综合精品一区二区| 国产蜜臀一区二区打屁股调教| 欧美一级日韩免费不卡| 少妇高潮在线观看| 老司机精品视频在线| 午夜精品区一区二区三| 在线成人视屏 | 亚洲成人免费观看| 中文字幕av一区二区三区人妻少妇 | 日本视频在线播放| 欧美熟乱第一页| 妺妺窝人体色WWW精品| 久久深夜福利| 日本视频精品一区| 欧美va在线观看| 在线播放亚洲激情| 91片黄在线观看喷潮| 1000精品久久久久久久久| 日本中文字幕二区| 综合在线一区| 国产精品大全| 欧美少妇网站| 国产亚洲欧美日韩美女| 夜夜狠狠擅视频| 亚洲精品免费一二三区| 性猛交╳xxx乱大交| 亚洲日本成人| 欧美精品与人动性物交免费看| 日韩成人亚洲| 久久久99免费视频| 亚洲黄色片视频| 天天免费综合色| 亚洲性猛交xxxx乱大交| 久草这里只有精品视频| 国产成人艳妇aa视频在线 | 黄色香蕉视频在线观看| 国产精品白丝av| 久久综合久久网| 国产欧美一区二区精品久久久| 国产久一一精品| 日本一级理论片在线大全| 日韩国产激情在线| 中文字幕精品无码亚| 亚洲精品中文字幕乱码三区| 国产精品九九视频| 日本亚洲视频在线| 日本中文字幕一级片| 羞羞色国产精品网站| 国产精品美女网站| 欧美wwww| 在线日韩日本国产亚洲| 精品人妻无码一区二区色欲产成人 | 亚洲深夜视频| 日韩一区二区欧美| 黄色aaa毛片| 欧美性猛交xxx| 久久高清内射无套| 久久噜噜亚洲综合| 男插女视频网站| 玖玖在线精品| 男人的天堂avav| 日韩夫妻性生活xx| 国产一区二区三区av在线| 日韩精品免费观看视频| 久久久久久国产免费| 高清中文字幕一区二区三区| 欧美成人三级在线| 中文字幕欧美人妻精品一区蜜臀| 亚洲一区二区美女| 九九热久久免费视频| 97久久超碰精品国产| 欧美一级小视频| 久久国产精品99国产| 久久这里只有精品8| 日韩在线精品| 欧美污视频久久久| 牛牛影视一区二区三区免费看| 亚洲自拍小视频| jizz亚洲女人高潮大叫| 538国产精品一区二区免费视频 | 美女黄色片视频| 一本综合精品| 国产成人生活片| 亚洲电影在线一区二区三区| 青青草国产精品| 久久影视三级福利片| 91黄在线观看| 亚洲免费一区| 国产精品91视频| 天堂av在线网| 韩国欧美亚洲国产| 日本动漫理论片在线观看网站| 久久亚洲精品一区二区| 91xxx在线观看| 在线观看国产欧美| 二区三区在线播放| 国产亚洲欧美一区| 国产精品久久久久久久龚玥菲| 日韩成人av一区| 日韩av资源站| 亚洲精品在线视频| 亚洲区小说区图片区| 亚洲国产日韩欧美在线99| 亚洲精品久久久蜜桃动漫 | 亚洲国产一区在线观看| 手机在线免费看毛片| 亚洲三级在线观看| 91传媒免费观看| 亚洲欧美在线观看| 国产精品丝袜一区二区| 亚洲另类春色国产| 国产成人无码aa精品一区| 尤物av一区二区| 伊人国产在线观看| 精品美女久久久久久免费| 久久久精品福利| 日本久久精品电影| 中文亚洲av片在线观看| 欧美日韩精品系列| 国产又粗又猛又黄又爽无遮挡| 91精品国产欧美一区二区| 国产精品午夜福利| 欧美videos中文字幕| 六月丁香色婷婷| 日韩精品免费电影| 国产福利在线看| 精品国产一区二区三区久久狼黑人 | 久久影院视频免费| 免费看日本黄色片| 亚洲欧美视频在线观看视频| 国产一国产二国产三| 欧美日韩国产在线| 99re热视频| 日韩一二在线观看| 视频三区在线观看| 色777狠狠综合秋免鲁丝| www久久日com| 久久久亚洲天堂| 日韩国产网站| 成人欧美一区二区三区视频| 精品在线播放| 91手机视频在线| 日韩天天综合| 一女二男3p波多野结衣| 懂色av一区二区在线播放| 国产福利短视频| 中文字幕一区二区三区在线播放 | 国产精品v日韩精品v欧美精品网站| 人人妻人人澡人人爽欧美一区| 久久精品30| 亚洲热在线视频| 久久综合九色欧美综合狠狠| 国产精品白丝喷水在线观看| 精品国产91久久久久久老师| 中文字幕一区二区三区人妻四季| 精品国产免费视频| 97超碰国产一区二区三区| 久久99青青精品免费观看| 暖暖成人免费视频| 51午夜精品| 精品国产美女| www.avtt| 免费成人美女在线观看.| 精品熟女一区二区三区| 国产精品欧美一区二区三区| 精品无码av在线| 欧美欧美欧美欧美| 青青草免费在线| 久久久久久久国产| 亚洲香蕉久久| 日本成人黄色免费看| 激情综合自拍| 人妻换人妻仑乱| 国产精品网站一区| 欧美一区二区三区四| 精品欧美乱码久久久久久 | 中文字幕不卡在线| 日本高清www免费视频| 91精品国产一区二区三区蜜臀 | 26uuu国产电影一区二区| 欧美黑吊大战白妞| 欧美精品三级在线观看| 国产视频二区在线观看| 97精品国产97久久久久久| 国产成年精品| 亚洲人成77777| 日本女人一区二区三区| 成年人网站免费看| 天天做天天摸天天爽国产一区| 国产99999| 久久精品2019中文字幕| 成人黄页网站视频| 欧美在线激情| 久久婷婷av| 老牛影视av老牛影视av| 五月激情综合网| 午夜成人免费影院| 7m精品福利视频导航| 欧美尿孔扩张虐视频| 欧美三级一级片| 91在线视频免费91| 国内精品福利视频| 日韩av在线免费观看一区| 国产传媒在线| 久久精品日产第一区二区三区| 亚洲毛片播放| 国产视频精品视频| 五月综合激情婷婷六月色窝| 欧洲av在线播放| 98精品国产自产在线观看| 久久综合社区| 成人在线观看a| 中文一区二区在线观看| 亚洲中文字幕在线一区| xxx欧美精品| 玖玖精品一区| www在线观看免费| 久久一留热品黄| 一区二区乱子伦在线播放| 最新69国产成人精品视频免费| 欧美三级电影网址| 裸体大乳女做爰69| 成人福利视频在线| 国产又黄又猛又粗又爽| 亚洲一区二区精品| 祥仔av免费一区二区三区四区| 大桥未久一区二区| 粉嫩嫩av羞羞动漫久久久 | 午夜在线视频一区二区区别| 扒开jk护士狂揉免费| 欧美日韩国产精品自在自线| 国产三区视频在线观看| 国产一区福利视频| 久久一区亚洲| 国产少妇在线观看| 日韩激情片免费| 视频欧美精品| 国产午夜福利100集发布| 欧美国产日韩亚洲一区| 国产女人18毛片水18精| 97视频免费看| 欧美电影一区| 漂亮人妻被黑人久久精品| 欧美在线免费观看视频| 新版中文在线官网| 九九九九九九精品| 久久精品国产999大香线蕉| 久草视频手机在线观看| 国产亚洲精品日韩| 91国内精品| 日韩一区二区三区不卡视频| 亚洲一区欧美一区| www.视频在线.com| 国产三级精品在线不卡| 理论电影国产精品| 国产福利拍拍拍| 大胆欧美人体视频| 欧美综合久久|