日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

同事的【策略模式】比我高級這么多?我哪里比不過人家?

來源: 責(zé)編: 時間:2024-01-22 17:24:14 279觀看
導(dǎo)讀大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎(chǔ)是進(jìn)階的前提是我的初心~最近我在項目中遇到一個需求,就是需要根據(jù)一個人的這些條件:名字歲數(shù)體重根據(jù)不同的這些條件去執(zhí)行不同的函數(shù),比如:林三心-20-1

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎(chǔ)是進(jìn)階的前提是我的初心~NU128資訊網(wǎng)——每日最新資訊28at.com

最近我在項目中遇到一個需求,就是需要根據(jù)一個人的這些條件:NU128資訊網(wǎng)——每日最新資訊28at.com

  • 名字
  • 歲數(shù)
  • 體重

根據(jù)不同的這些條件去執(zhí)行不同的函數(shù),比如:NU128資訊網(wǎng)——每日最新資訊28at.com

  • 林三心-20-160: 輸出我叫林三心,我是個年輕人,我是個瘦子
  • 林三心-60-300: 輸出我叫林三心,我是個老年人,我是個胖子

這種判斷是需要嵌套判斷的,情況非常多,寫起代碼非常麻煩,且可維護(hù)性很差,所以我第一時間想到了策略模式來解決,但是發(fā)現(xiàn)大部分網(wǎng)上的策略模式方案講解都不太符合我這個需求。NU128資訊網(wǎng)——每日最新資訊28at.com

最近我對策略模式又有新的理解,我想通過我自己的方式將這些知識分享給大家。NU128資訊網(wǎng)——每日最新資訊28at.com

NU128資訊網(wǎng)——每日最新資訊28at.com

你認(rèn)識策略模式嗎?

我理解策略模式就是,在不同的條件下去做不用的事情,并且這些事情是不會互相影響的,我們可以把這些不同的事情封裝起來。NU128資訊網(wǎng)——每日最新資訊28at.com

就比如下面的簡單例子,根據(jù) name 的不同的值,去執(zhí)行不同的代碼:NU128資訊網(wǎng)——每日最新資訊28at.com

NU128資訊網(wǎng)——每日最新資訊28at.com

上面的代碼怎么優(yōu)化呢?看過一些簡單策略模式的朋友,肯定第一感覺就是使用對象去存儲,其實在這個場景中,完全可以去這么做:NU128資訊網(wǎng)——每日最新資訊28at.com

NU128資訊網(wǎng)——每日最新資訊28at.com

復(fù)雜情況呢?

上面的代碼例子是非常簡單的,但是如果是一些比較復(fù)雜的場景呢?比如我不止 name 了,我加了 age ,那么這樣的 if 嵌套,你又該如何去用簡單的 map 去解決呢?NU128資訊網(wǎng)——每日最新資訊28at.com

NU128資訊網(wǎng)——每日最新資訊28at.com

有人說,那我這樣去做,不就行了~NU128資訊網(wǎng)——每日最新資訊28at.com

NU128資訊網(wǎng)——每日最新資訊28at.com

是,其實你非要去做也能做,無非就是麻煩點,但是如果我不止 name、age,我又加了 height、weight、username、phone 之類的判斷條件,請問閣下又該如何應(yīng)對呢?而且是嵌套的哦~NU128資訊網(wǎng)——每日最新資訊28at.com

還有一種情況,就是如果我們并不是每一個分支的情況都需要去執(zhí)行代碼的,比如:NU128資訊網(wǎng)——每日最新資訊28at.com

  • sunshine_lin:只需要關(guān)注 20、40歲 的情況
  • sanxin_lin:只需要關(guān)注 60歲 的情況
  • 林三心:只需要關(guān)注 20歲 的情況

或者哪天我想改變規(guī)則了,比如:我想改變一下,只關(guān)注 sunshine_lin 的 40歲 情況。NU128資訊網(wǎng)——每日最新資訊28at.com

在遇到上述所說這些情況的時候,如果你還以上面的策略模式方案去解決問題,那么解決起來會非常棘手,可維護(hù)性也不太高,所以我們應(yīng)該換一個方案~NU128資訊網(wǎng)——每日最新資訊28at.com

換湯不換藥

大方向上,還是用一個對象去映射,也就是不同條件映射到不同的執(zhí)行代碼,只不過呢,這個時候我們要把條件換一換,還是剛剛的例子:NU128資訊網(wǎng)——每日最新資訊28at.com

NU128資訊網(wǎng)——每日最新資訊28at.com

換一種思路,我們使用一個集合去當(dāng)條件,比如像這樣子:NU128資訊網(wǎng)——每日最新資訊28at.com

NU128資訊網(wǎng)——每日最新資訊28at.com

是的,這個所謂的集合就是所有判斷條件組成的一個對象,把他轉(zhuǎn)成字符串,當(dāng)做策略的條件,這樣是不是就看起來更加方便了?但其實是有坑的,比如下面這兩種條件,其實就是同一個條件,但是因為序列化時會有順序的問題,導(dǎo)致了兩個相同的條件匹配不到同一個函數(shù):NU128資訊網(wǎng)——每日最新資訊28at.com

NU128資訊網(wǎng)——每日最新資訊28at.com

所以我們需要對條件對象進(jìn)行排序,要保證這兩個條件匹配到同一個函數(shù),怎么做呢?我們要讓他們順序保持一直就行了!!需要利用到 Map 這個數(shù)據(jù)結(jié)構(gòu),Map 的 key 是有順序的~NU128資訊網(wǎng)——每日最新資訊28at.com

NU128資訊網(wǎng)——每日最新資訊28at.com

這樣就保證了不同順序的條件對象,能匹配到同一個函數(shù)了~NU128資訊網(wǎng)——每日最新資訊28at.com

封裝 + 可拓展性

上面的代碼都是比較散的代碼,如果想要代碼更好的復(fù)用,肯定是需要進(jìn)行封裝,使用一個 class 去封裝,并且你要考慮一些邊界情況,比如:NU128資訊網(wǎng)——每日最新資訊28at.com

  • 條件匹配不上,需要執(zhí)行默認(rèn)情況
  • 代碼報錯處理

想要更好地去完成這個方案,我們可以借助另一種設(shè)計模式發(fā)布訂閱模式,具體代碼請看下方,我建議大家要多看代碼,多敲,從中領(lǐng)略到它到底有啥好處~NU128資訊網(wǎng)——每日最新資訊28at.com

NU128資訊網(wǎng)——每日最新資訊28at.com

完整代碼

class Strategy {  map = new Map();  constructor({ defaultCbs, errorCbs }) {    // 默認(rèn)    this.map.set("default", defaultCbs ?? []);    // 錯誤    this.map.set("error", errorCbs ?? []);  }  // 獲取條件key  getCondition(condition) {    const conditionMap = new Map();    Object.keys(condition)      .sort()      .forEach((key) => {        conditionMap.set(key, condition[key]);      });    return JSON.stringify(Object.fromEntries(conditionMap));  }  // 增加條件情況  add(condition, conditionCbs) {    const currentCondition = this.getCondition(condition);    let cbs = this.map.get(currentCondition);    if (!cbs) {      this.map.set(currentCondition, []);      cbs = this.map.get(currentCondition);    }    cbs.push(...conditionCbs);  }  // 執(zhí)行條件情況  do(condition) {    const currentCondition = this.getCondition(condition);    try {      const cbs = this.map.get(currentCondition);      if (cbs) {        cbs.forEach((cb) => cb(JSON.parse(currentCondition)));      } else {        // 匹配不到則執(zhí)行默認(rèn)函數(shù)        const defaultCbs = this.map.get("default");        defaultCbs.forEach((cb) => cb(JSON.parse(currentCondition)));      }    } catch (e) {      // 報錯執(zhí)行報錯函數(shù)      const errorCbs = this.map.get("error");      errorCbs.forEach((cb) => cb(e));    }  }}const strategy = new Strategy({  defaultCbs: [    (v) => {      console.log("這是默認(rèn)情況", v);    },  ],  errorCbs: [    (e) => {      console.log("這是錯誤情況", e);    },  ],});const condition = {  name: "sunshine_lin",  weight: 160,};// 此時還沒有注冊條件事件,所以輸出默認(rèn)事件strategy.do(condition); // 添加條件函數(shù)strategy.add(condition, [  (v) => {    console.log("事件1", v);  },  (v) => {    console.log("事件2", v);  },]);// 此時有條件事件了,輸入:事件1 事件2strategy.do(condition);const condition2 = {  name: "error_lin",  weight: 1000000,};// 可以增加報錯條件strategy.add(condition2, [  (v) => {    throw new Error("我超重啦!!!!");  },]);// 報錯,輸出:我超重啦!!!!strategy.do(condition2)

本文鏈接:http://m.www897cc.com/showinfo-26-66194-0.html同事的【策略模式】比我高級這么多?我哪里比不過人家?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Python中zoneinfo模塊的用法

下一篇: C++內(nèi)存管理的奧秘:從基礎(chǔ)到高級

標(biāo)簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
一本色道久久综合亚洲二区三区| 国产毛片精品视频| 久久久av毛片精品| 久久午夜精品一区二区| 欧美成va人片在线观看| 欧美日韩一区二区国产| 国产麻豆视频精品| 在线观看中文字幕不卡| 99国产精品国产精品久久| 在线一区日本视频| 久久精品夜色噜噜亚洲a∨| 欧美国产亚洲另类动漫| 欧美日韩在线观看一区二区| 国产欧美一区二区视频| 亚洲国产欧美在线人成| 亚洲午夜一区| 快she精品国产999| 欧美日韩三级一区二区| 红桃视频国产一区| 99在线热播精品免费| 先锋影音久久| 欧美大片在线观看一区| 国产精品免费久久久久久| 在线观看成人av电影| 亚洲一区二区精品| 麻豆精品91| 国产伦精品一区二区| 亚洲国产精品一区二区尤物区 | 国产一区二区三区观看| 亚洲精品久久久久久久久| 性欧美办公室18xxxxhd| 欧美精品123区| 国产专区欧美专区| 亚洲视频在线视频| 免费欧美日韩| 国产三级欧美三级日产三级99| 亚洲精品欧美在线| 久久久久久一区二区| 欧美日韩一级黄| 亚洲高清资源| 午夜久久tv| 欧美日韩视频| 在线观看欧美日本| 欧美一区二区免费| 国产精品大全| 亚洲精选中文字幕| 久久免费一区| 国产日韩欧美视频| 一区二区高清在线| 美日韩免费视频| 国内精品福利| 欧美一区2区视频在线观看| 欧美视频一区在线观看| 亚洲精品久久久蜜桃| 久久久久久久久久久久久9999| 国产精品久久久亚洲一区| 亚洲国产一区二区a毛片| 久久精品国产99| 国产精品综合视频| 亚洲尤物精选| 欧美性大战xxxxx久久久| 亚洲精品日本| 免费观看一区| 在线观看成人av电影| 久久精品国产亚洲5555| 国产日本欧美一区二区| 亚洲特色特黄| 欧美日韩一区二区欧美激情| 亚洲日本成人女熟在线观看| 蜜臀av性久久久久蜜臀aⅴ| 激情久久中文字幕| 久久久国产一区二区三区| 国产亚洲一本大道中文在线| 午夜精品福利一区二区三区av| 欧美四级剧情无删版影片| 99精品视频免费| 欧美日韩1区2区| 99精品久久免费看蜜臀剧情介绍| 欧美成人一二三| 亚洲精品123区| 欧美激情女人20p| 亚洲精品免费一二三区| 欧美激情精品| 99视频有精品| 欧美系列精品| 亚洲小说区图片区| 国产嫩草影院久久久久| 久久成人精品电影| 伊人成年综合电影网| 米奇777在线欧美播放| 亚洲黄色免费| 欧美日韩免费观看一区| 亚洲视屏在线播放| 国产精品无码永久免费888| 午夜精品久久久久久久男人的天堂 | 99综合电影在线视频| 欧美日韩视频在线一区二区| 在线亚洲+欧美+日本专区| 国产精品久久久久国产精品日日| 亚洲女人天堂av| 国产中文一区二区| 久久亚洲午夜电影| 亚洲精品久久久久久一区二区| 欧美片在线观看| 亚洲主播在线播放| 国产一区欧美日韩| 欧美成人中文字幕| 亚洲视频在线一区观看| 国产精品午夜电影| 久久精品日韩欧美| 亚洲人精品午夜在线观看| 欧美视频一二三区| 欧美专区福利在线| 亚洲国产精品福利| 欧美日韩国产精品一区| 亚洲欧美激情视频| 黄色一区二区三区| 欧美精品日韩一本| 亚洲欧美综合| 亚洲高清123| 欧美性猛交xxxx乱大交退制版| 欧美亚洲专区| 亚洲精品1区| 国产精品资源| 欧美成人a视频| 亚洲影视在线播放| 曰韩精品一区二区| 欧美性视频网站| 久久麻豆一区二区| 一区二区av在线| 韩国福利一区| 欧美日韩一级黄| 久久九九全国免费精品观看| 亚洲精品国偷自产在线99热| 国产精品青草久久| 免费在线成人| 欧美亚洲在线| 亚洲精品视频在线播放| 国产日韩欧美二区| 欧美日韩国产精品成人| 久久久久久伊人| 亚洲在线免费| 91久久精品网| 国产日韩一区二区| 欧美高清在线视频观看不卡| 午夜一级久久| 99国产精品久久久久久久久久 | 亚洲欧美日韩精品久久奇米色影视| 国产一区二区三区奇米久涩| 欧美日韩二区三区| 久久久久国产精品厨房| 在线一区欧美| 亚洲国产va精品久久久不卡综合| 国产精品久久久久久亚洲毛片| 免费看成人av| 欧美中文字幕在线播放| 一本色道久久加勒比精品| 影音先锋中文字幕一区二区| 国产精品资源| 欧美视频一区在线观看| 免费观看欧美在线视频的网站| 亚洲一区中文字幕在线观看| 亚洲精品久久久久久久久久久久久 | 亚洲一区二区免费在线| 亚洲国产精品精华液2区45| 国产日韩欧美制服另类| 欧美日本一区二区高清播放视频| 久久久久五月天| 欧美亚洲视频| 亚洲专区欧美专区| 99视频精品全国免费| 亚洲高清在线视频| 国语自产在线不卡| 国产精自产拍久久久久久蜜| 欧美少妇一区二区| 欧美精品一区二区三区久久久竹菊| 久久精品亚洲乱码伦伦中文| 性做久久久久久| 亚洲综合色丁香婷婷六月图片| 99国产精品久久久久久久| 亚洲精品韩国| 亚洲日本国产| 亚洲人成在线影院| 亚洲国产精品成人综合| 在线观看欧美日本| 精品1区2区3区4区| 国外成人在线| 国产一区二区日韩精品欧美精品| 国产精品久久夜| 欧美性生交xxxxx久久久| 欧美视频在线观看免费| 欧美日本亚洲韩国国产| 欧美韩国一区| 欧美国产日产韩国视频| 欧美~级网站不卡| 蜜桃av一区二区在线观看| 久久理论片午夜琪琪电影网| 久久视频在线免费观看| 久久午夜精品| 浪潮色综合久久天堂| 免费观看成人| 欧美激情2020午夜免费观看| 欧美激情一区二区| 欧美人成在线视频|