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

if 判斷泛濫?試一試規(guī)則執(zhí)行器,太香了!

開發(fā) 前端
針對(duì)這個(gè)需求,我首先梳理了一下咱們規(guī)則執(zhí)行器大概的設(shè)計(jì), 然后我設(shè)計(jì)了一個(gè) V1 版本和大家一起分享一下,如果大家也有這樣的 case 可以給我分享留言,下面部分主要是設(shè)計(jì)和實(shí)現(xiàn)的流程和 code。

業(yè)務(wù)場(chǎng)景

近日在公司領(lǐng)到一個(gè)小需求,需要對(duì)之前已有的試用用戶申請(qǐng)規(guī)則進(jìn)行拓展。我們的場(chǎng)景大概如下所示:

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

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

if (未付費(fèi)用戶 && 不再服務(wù)時(shí)段) {
  return false
}

if (轉(zhuǎn)介紹用戶 || 付費(fèi)用戶 || 內(nèi)推用戶) {
  return true;
}

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

  • 咱們的的主要流程主要是基于 and 或者 or 的關(guān)系。
  • 如果有一個(gè)不匹配的話,其實(shí)咱們后續(xù)的流程是不用執(zhí)行的,就是需要具備一個(gè)短路的功能。
  • 對(duì)于目前的現(xiàn)狀來(lái)說,我如果在原有的基礎(chǔ)上來(lái)改,只要稍微注意一下解決需求不是很大的問題,但是說后面可維護(hù)性非常差。

后面進(jìn)過權(quán)衡過后,我還是決定將這個(gè)部分進(jìn)行重構(gòu)一下。

規(guī)則執(zhí)行器

針對(duì)這個(gè)需求,我首先梳理了一下咱們規(guī)則執(zhí)行器大概的設(shè)計(jì), 然后我設(shè)計(jì)了一個(gè) V1 版本和大家一起分享一下,如果大家也有這樣的 case 可以給我分享留言,下面部分主要是設(shè)計(jì)和實(shí)現(xiàn)的流程和 code.

規(guī)則執(zhí)行器的設(shè)計(jì)

圖片圖片

對(duì)于規(guī)則的抽象并實(shí)現(xiàn)規(guī)則

// 業(yè)務(wù)數(shù)據(jù)
@Data
public class RuleDto {
  private String address;
 private int age;
}

// 規(guī)則抽象
public interface BaseRule {

    boolean execute(RuleDto dto);
}

// 規(guī)則模板
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;
    }
}

// 具體規(guī)則- 例子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;
    }
}

// 具體規(guī)則- 例子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= "中國(guó)";
}

執(zhí)行器構(gòu)建

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 關(guān)系,同步執(zhí)行
                    System.out.println("execute key = " + 1);
                    if (!and(dto, ruleList)) {
                        return false;
                    }
                    break;
                case OR:
                    // 如果是 or 關(guān)系,并行執(zhí)行
                    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 關(guān)系匹配失敗一次,返回 false
                return false;
            }
        }
        // and 關(guān)系全部匹配成功,返回 true
        return true;
    }

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

執(zhí)行器的調(diào)用

public class RuleServiceTest {

    @org.junit.Test
    public void execute() {
        //規(guī)則執(zhí)行器
        //優(yōu)點(diǎn):比較簡(jiǎn)單,每個(gè)規(guī)則可以獨(dú)立,將規(guī)則,數(shù)據(jù),執(zhí)行器拆分出來(lái),調(diào)用方比較規(guī)整
        //缺點(diǎn):數(shù)據(jù)依賴公共傳輸對(duì)象 dto

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

        //2. 構(gòu)造需要的數(shù)據(jù) create dto
        RuleDto dto = new RuleDto();
        dto.setAge(5);
        dto.setName("張三");
        dto.setAddress("北京");
        dto.setSubject("數(shù)學(xué)");;

        //3. 通過以鏈?zhǔn)秸{(diào)用構(gòu)建和執(zhí)行 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);
    }
}

總結(jié)

規(guī)則執(zhí)行器的優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn):

比較簡(jiǎn)單,每個(gè)規(guī)則可以獨(dú)立,將規(guī)則,數(shù)據(jù),執(zhí)行器拆分出來(lái),調(diào)用方比較規(guī)整;

我在 Rule 模板類中定義 convert 方法做參數(shù)的轉(zhuǎn)換這樣可以能夠,為特定 rule 需要的場(chǎng)景數(shù)據(jù)提供拓展。

缺點(diǎn):

上下 rule 有數(shù)據(jù)依賴性,如果直接修改公共傳輸對(duì)象 dto 這樣設(shè)計(jì)不是很合理,建議提前構(gòu)建數(shù)據(jù)。

責(zé)任編輯:武曉燕 來(lái)源: 碼猿技術(shù)專欄
相關(guān)推薦

2017-09-14 10:02:36

程序員體驗(yàn)驗(yàn)證

2025-07-21 05:00:00

if-elseV1版本

2025-08-15 12:19:08

2025-11-03 10:16:59

架構(gòu)圖容器代碼

2016-08-23 09:05:47

Windows 10凍結(jié)系統(tǒng)更新

2024-07-03 08:13:56

規(guī)則執(zhí)行器代碼

2012-04-17 11:23:42

imo即時(shí)通訊

2023-11-07 10:36:37

2014-12-29 10:05:24

iOS 8越獄插件

2015-12-08 12:10:50

2018-05-11 16:42:01

華為云

2024-01-05 13:26:00

KafkaTopicSpring

2024-01-26 07:48:10

SpringKafka提升

2022-04-29 08:41:40

開發(fā)應(yīng)用程序執(zhí)行器

2022-12-25 16:30:53

人工智能工具

2020-10-10 11:07:38

Java開發(fā)代碼

2020-10-16 08:26:07

JavaScript開發(fā)技術(shù)

2017-03-02 08:34:00

云服務(wù)擴(kuò)展芯片IT

2012-11-15 10:35:30

淘寶開源系統(tǒng)

2024-03-26 07:55:49

CSS工具HTML代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲欧美综合v| 色哟哟在线观看一区二区三区| 91精品天堂| 久久夜靖品2区| 欧美日韩在线网站| 欧美一级精品大片| 久久精品网站视频| 牛牛在线精品视频| 国产亚洲一二三区| av一区二区三区四区电影| 免费黄色网址在线| 欧美伊人久久| 国产一区二区三区视频 | 久草福利资源在线| 国产精品毛片视频| 欧美日韩国产精品自在自线| 国产一级爱c视频| 日本三级在线视频| 91视频.com| 成人黄色片视频网站| 中文无码精品一区二区三区| 国产欧美日韩一区二区三区在线| 久久婷婷国产麻豆91天堂| 扒开jk护士狂揉免费| 亚洲经典视频| 69堂国产成人免费视频| 国内自拍视频网| 九九色在线视频| 亚洲欧洲一区二区三区| 色综合影院在线观看| 日韩中文字幕免费在线观看| 国产资源精品在线观看| 国产精品成人va在线观看| 国产五月天婷婷| 午夜久久黄色| 久久色在线播放| 国产又粗又猛又爽又黄的视频四季 | 欧美大喷水吹潮合集在线观看| 国产激情欧美| 91成人网在线| 国产真实乱子伦| 小早川怜子影音先锋在线观看| 亚洲男人的天堂av| 99热这里只有精品7| 在线看av的网址| 欧美激情一区在线| 欧美日韩一区二| 日本啊v在线| 91免费在线播放| 美女亚洲精品| 青草久久伊人| 久久久久久久av麻豆果冻| 久久视频在线观看中文字幕| 视频污在线观看| 成人国产精品视频| 精品伦精品一区二区三区视频| 亚洲女人18毛片水真多| 成人免费毛片嘿嘿连载视频| 国产日韩欧美一区二区| 日本精品999| 99re热这里只有精品免费视频| 韩国一区二区三区美女美女秀 | 最新精品在线| 欧美大片顶级少妇| 水蜜桃av无码| 国产精品片aa在线观看| 亚洲午夜精品视频| av在线免费播放网址| 欧美aaaa视频| 欧美成人午夜激情| 久久免费黄色网址| 97超级碰碰人国产在线观看| 国产一区二区在线视频播放| √天堂8资源中文在线| 亚洲一级在线观看| 91黄色在线看| 男女羞羞在线观看| 色8久久精品久久久久久蜜| 成年人小视频网站| 天堂久久一区| 精品乱人伦一区二区三区| japanese在线观看| 久久97视频| 日韩一区二区三区在线播放| 欧美特级一级片| 亚洲欧洲一级| 国产精品久久久久久久久免费看 | 成人综合电影| 亚洲欧美日韩精品永久在线| 中文成人av在线| 91精品国产吴梦梦| 超碰一区二区| 91精品国产欧美日韩| 欧美肉大捧一进一出免费视频| 亚洲裸色大胆大尺寸艺术写真| 国产一区二区三区在线看 | 亚洲国产精品自拍| 99久久国产宗和精品1上映| 涩涩涩久久久成人精品| 亚洲电影免费观看高清完整版在线| av男人的天堂av| 欧美视频亚洲视频| 国产精品欧美亚洲777777| 国产美女www爽爽爽视频| 99免费精品视频| 一区二区三区我不卡| 国产不卡123| 欧美日韩国产小视频在线观看| 天天躁日日躁狠狠躁av麻豆男男 | 伊人网在线免费| 午夜欧美巨大性欧美巨大| 欧美一级一区二区| 成人乱码一区二区三区av| 午夜日本精品| 国产精品久久久久久久久免费看 | 欧美一级做a爰片免费视频| 国产精品888| 天堂社区 天堂综合网 天堂资源最新版| 日本大胆在线观看| 欧美美女bb生活片| 精品无人区无码乱码毛片国产| 亚洲国产黄色| 91精品国产一区二区三区动漫| 91社区在线观看| 欧美日韩激情视频8区| xxxx国产视频| 香蕉综合视频| 国产精品露脸av在线| 天天干在线观看| 亚洲一区二区在线免费观看视频| 亚洲天堂2018av| 精品日韩在线| 青青久久av北条麻妃海外网| 午夜av免费观看| 一区二区三区产品免费精品久久75| 午夜视频你懂的| 九色精品国产蝌蚪| 日本午夜精品理论片a级appf发布| 国产 日韩 欧美 综合| 一区二区三区四区中文字幕| 一道本在线免费视频| 日韩精品一区二区三区免费观看| 日韩女优在线播放| 青青草在线免费视频| 欧美色视频日本版| jizz日本免费| 蘑菇福利视频一区播放| 欧美成人综合一区| 国产精欧美一区二区三区蓝颜男同| 亚洲国产日韩欧美在线99| 国产精品.www| av亚洲精华国产精华| 狠狠干 狠狠操| 菁菁伊人国产精品| 97视频在线观看免费高清完整版在线观看 | 国产九九精品| 日本不卡一区二区三区视频| 欧美大片免费高清观看| 亚洲性视频网址| 中文字幕无码乱码人妻日韩精品| 日本一区二区三区四区 | 大尺度一区二区| 人妻夜夜添夜夜无码av| 美女av一区| 国产国产精品人在线视| 午夜伦全在线观看| 91精品国产高清一区二区三区蜜臀| 国产高潮流白浆| 粉嫩一区二区三区性色av| 青青草成人免费在线视频| 偷拍自拍亚洲色图| 国产精品美女久久久久久免费| 在线播放麻豆| 欧美成人欧美edvon| 欧美福利视频一区二区| 26uuu久久综合| 黄色三级视频在线| 欧美福利在线| 欧美日韩综合久久| 日韩av黄色| 午夜欧美不卡精品aaaaa| 蜜桃成人在线视频| 欧美军同video69gay| 国产无遮挡裸体免费视频| 国产亚洲一本大道中文在线| 亚洲天堂伊人网| 亚洲日本成人| 成人手机视频在线| 欧美男男freegayvideosroom| 青青久久av北条麻妃海外网| 老司机在线看片网av| 亚洲国产天堂久久综合| 精品国产青草久久久久96| 一区二区三区蜜桃| 亚洲成人黄色av| 国产成人精品影视| 波多野结衣天堂| 欧美日韩国产一区精品一区| 日韩女优中文字幕| 91精品导航| 国产日本欧美视频| 男人av在线播放| 久久成人国产精品| 国产色a在线| 精品国产乱码久久久久久影片| 日韩免费av网站| 亚洲国产精品自拍| 91制片厂在线| 久久久av毛片精品| 久久性爱视频网站| 国内精品写真在线观看| 久久精品香蕉视频| 在线观看视频日韩| 在线观看日韩羞羞视频| 九九热爱视频精品视频| 国产一级特黄a大片99| 欧美网站免费| 国产精品成人aaaaa网站| 九色porny丨国产首页在线| 九九久久国产精品| 午夜视频在线观看网站| 亚洲欧美日韩区| 天堂在线视频观看| 欧美xxxx老人做受| 国产视频在线观看视频| 欧美日韩激情一区| 国产免费一级视频| 欧美日韩在线第一页| 男人天堂中文字幕| 亚洲国产欧美在线人成| 青草影院在线观看| 亚洲视频在线一区| 韩国一级黄色录像| 国产精品久久99| 网爆门在线观看| 国产精品素人视频| 手机看片国产日韩| 国产精品久久毛片| 天天爽天天爽天天爽| 国产精品久久久久久久岛一牛影视| a级大片在线观看| 久久久另类综合| 黑人无套内谢中国美女| 国产一区二区伦理| 国产精品久久久久久9999| 国模娜娜一区二区三区| 欧美女同在线观看| 精品一区二区三区欧美| 肉色超薄丝袜脚交| 国产专区综合网| 在线成人精品视频| 国产不卡免费视频| 动漫美女无遮挡免费| 丁香天五香天堂综合| 91传媒理伦片在线观看| 成人白浆超碰人人人人| 亚洲图片综合网| 久久精品一区二区| 波多野结衣家庭教师在线观看| 国产精品国产精品国产专区不片| 欧美aaa级片| 亚洲狼人国产精品| 国产亚洲精品av| 狠狠久久亚洲欧美专区| 天天操夜夜操视频| 欧美日韩在线播放一区| 国产精品无码专区av免费播放| 777午夜精品视频在线播放| а√天堂资源在线| 精品视频久久久久久| av亚洲在线| 欧美区在线播放| 少妇在线看www| 国产精品一区二区三| 亚洲一区 二区| 久久久精品国产一区二区三区| 精品国产一区二区三区小蝌蚪| 亚洲一区二区在| 亚洲天堂偷拍| 大香煮伊手机一区| 国产精品456露脸| 一本色道久久综合亚洲精品图片 | 亚洲精品电影网在线观看| 国产有码在线| 欧美国产日韩xxxxx| 欧美专区福利免费| 亚洲在线免费观看| 亚洲黄页在线观看| 中文字幕精品一区日韩| 99精品99| 五月激情五月婷婷| 波多野结衣在线aⅴ中文字幕不卡| 在线看片中文字幕| 亚洲成人1区2区| 国产精品一级视频| 日韩精品中文字幕在线| www.久久ai| 国产99久久久欧美黑人| 人人爱人人干婷婷丁香亚洲| 茄子视频成人在线观看 | 日本新janpanese乱熟| 国产成人免费在线观看不卡| a天堂中文字幕| 亚洲影视在线播放| 中文字幕人成人乱码亚洲电影| 亚洲第一区中文99精品| 日本不卡不卡| 国产91色在线免费| 风间由美一区二区av101| 亚洲精品乱码视频| 久久精品成人| 永久免费未满蜜桃| 亚洲欧美色图小说| 国产女优在线播放| 国产视频久久久| 538视频在线| 99精品99久久久久久宅男| 久久看人人摘| 成人性做爰aaa片免费看不忠| 成人丝袜18视频在线观看| 三上悠亚在线观看视频| 91福利在线导航| 日本福利午夜视频在线| 欧美激情久久久久| 麻豆国产一区| 中文字幕精品—区二区日日骚| 日本不卡视频在线观看| 日韩av一二区| 精品电影在线观看| 日韩中文字幕免费观看| 久久久久中文字幕2018| 精品久久国产一区| 精品久久免费观看| 狠狠色狠狠色合久久伊人| 日本美女xxx| 91精品办公室少妇高潮对白| 色鬼7777久久| 欧美在线视频免费观看| 香蕉久久精品| 欧洲黄色一级视频| 26uuu欧美| 婷婷激情五月综合| 亚洲性线免费观看视频成熟| 高清电影一区| 色姑娘综合网| 日本aⅴ亚洲精品中文乱码| 美国美女黄色片| 欧美日韩电影一区| 高清免费电影在线观看| 91久久精品国产91久久| 中文字幕一区二区三区欧美日韩| 国产成人美女视频| 亚洲精品一二三| 亚洲不卡免费视频| 97av在线视频免费播放| 国产一区二区三区四区| 欧美精品aaaa| 亚洲视频狠狠干| 亚洲卡一卡二卡三| 高清一区二区三区四区五区 | 一区二区三区国| 国产综合久久久久久久久久久久| 国产探花在线免费观看| 精品国产乱码久久久久久1区2区| 国产精品论坛| 日本在线观看一区二区三区| 久久69国产一区二区蜜臀| www.av成人| 亚洲国产精品久久久久秋霞不卡| 亚洲黄色免费av| 一区二区精品在线| 粉嫩高潮美女一区二区三区| a v视频在线观看| 欲色天天网综合久久| 秋霞一区二区三区| 欧美二区在线视频| 国产精品免费视频观看| 午夜精品久久久久久久爽 | 尤物九九久久国产精品的分类| 日韩国产91| av免费看网址| 国产精品污www在线观看| 国产黄色一级大片| 2020欧美日韩在线视频| 99视频精品全部免费在线视频| 四虎永久免费观看| 日本高清成人免费播放| 成人日日夜夜| 欧美激情一区二区三区在线视频 | 日本欧美在线视频免费观看| 成人av网站观看| 日本不卡一区二区三区高清视频| 妺妺窝人体色www在线下载| 亚洲欧美999| 一区二区三区国产好| av免费网站观看| 亚洲国产精品视频| av片在线看| 久久久久久久久久久一区 | 在线亚洲国产精品网站|