單例模式、發(fā)布訂閱饿序、觀察者模式勉失、迭代器模式

單例模式

  • 例如頁面有一個(gè)modal彈窗,無論哪個(gè)頁面每次打開彈窗原探,其實(shí)都可以用同一個(gè)彈窗實(shí)例乱凿,不需要多次創(chuàng)建
  • 代碼實(shí)現(xiàn): 多次調(diào)用 aa 只打印一次 111, a == b 結(jié)果為true
var aa = (function () {
    var instance
    return function () {
        function Modal() {
            this.init();
        }
        Modal.prototype.init = function () {
            console.log('創(chuàng)建了modal')
        }
        if (!instance) { 
            console.log(111)  // 只打印一次 
            instance = new Modal();
        }
        return instance;
    }
})()
let a = aa()
let b = aa()
console.log(a, b , a == b)

觀察者模式和發(fā)布訂閱模式

  • 其實(shí)差不多,發(fā)布訂閱是觀察者模式的升級版
  • 發(fā)布訂閱比觀察者模式多了一個(gè)事件調(diào)度中心
  • 他們都是維持了對象/主題(subject)一對多依賴
  • 觀察者:維持的是對象以及依賴這個(gè)對象的多個(gè)事件的關(guān)系咽弦;
  • 發(fā)布訂閱:對象的不同主題以及依賴不同主題的多個(gè)事件的關(guān)系徒蟆;

發(fā)布訂閱模式 - 賊簡單實(shí)現(xiàn)

class Observable {
    private handlers: {
        [props: string]: fn[]
    } = {};
    subscribe(key: string, fun: fn) {
        if (!this.handlers[key]) this.handlers[key] = [];
        this.handlers[key].push(fun);
    }
    unSubscribe(key: string) { 
        delete this.handlers[key];
    }
    publish<K>(key: string, val: K) {
        let handlers = this.handlers[key] || [];
        handlers.forEach(item => {
            item(val)
        })
    }
 }
type fn = (v: any) => void;

// test
var observer = new Observable();
observer.subscribe('name', (val) => {
    console.log(`1 name is ${val}`)
})
observer.subscribe('name', (val) => {
    console.log(`2 name is ${val}`)
})
observer.subscribe('age', (val) => {
    console.log(`1 age is ${val}`)
})
observer.publish<string>('name', 'liuxinya')
observer.publish<number>('age', '18')

觀察者模式

  • handlers變成一個(gè)單一的數(shù)組
  • 訂閱直接往數(shù)組里面存事件
  • 發(fā)布直接遍歷數(shù)組里面的事件并傳入新值

Iterator Pattern

class IteratorFromArray {
    _array: any[]
    _cursor: number
    constructor(arr: any[]) {
        this._array = arr;
        this._cursor = 0;
    }
  
    next() {
        return this._cursor < this._array.length ?
        { value: this._array[this._cursor++], done: false } :
        { done: true };
    }
    map(callback: (v: any) => {done: boolean, value: any}) {
        let iterator = new IteratorFromArray(this._array)
        return {
            next: () => {
                const { done, value } = iterator.next()
                return {
                    done,
                    value: value ? callback(value) : undefined
                }
            }
        }  
    }
}
let test = new IteratorFromArray([1, 2, 3, 4])
console.log(test.next()) // {value: 1, done: false}
console.log(test.next())  //  {value: 2, done: false}
console.log(test.next()) //  {value: 3, done: false}

let testMap = test.map(value => value + 1)
console.log(testMap.next()) //{done: false, value: 2}
console.log(testMap.next()) // {done: false, value: 3}
console.log(testMap.next())
console.log(testMap.next())
console.log(testMap.next()) // {done: true, value: undefined}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市型型,隨后出現(xiàn)的幾起案子段审,更是在濱河造成了極大的恐慌,老刑警劉巖闹蒜,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寺枉,死亡現(xiàn)場離奇詭異,居然都是意外死亡绷落,警方通過查閱死者的電腦和手機(jī)姥闪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砌烁,“玉大人筐喳,你說我怎么就攤上這事。” “怎么了避归?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵荣月,是天一觀的道長。 經(jīng)常有香客問我槐脏,道長喉童,這世上最難降的妖魔是什么撇寞? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任顿天,我火速辦了婚禮,結(jié)果婚禮上蔑担,老公的妹妹穿的比我還像新娘牌废。我一直安慰自己,他們只是感情好啤握,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布鸟缕。 她就那樣靜靜地躺著,像睡著了一般排抬。 火紅的嫁衣襯著肌膚如雪懂从。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天蹲蒲,我揣著相機(jī)與錄音番甩,去河邊找鬼。 笑死届搁,一個(gè)胖子當(dāng)著我的面吹牛缘薛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卡睦,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼宴胧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了表锻?” 一聲冷哼從身側(cè)響起恕齐,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞬逊,沒想到半個(gè)月后显歧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡码耐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年追迟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骚腥。...
    茶點(diǎn)故事閱讀 38,629評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敦间,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情廓块,我是刑警寧澤厢绝,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站带猴,受9級特大地震影響昔汉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拴清,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一靶病、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧口予,春花似錦娄周、人聲如沸承二。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽克婶。三九已至鸵荠,卻和暖如春稠鼻,著一層夾襖步出監(jiān)牢的瞬間商佑,已是汗流浹背耕挨。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工舷礼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹃彻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓且轨,卻偏偏與公主長得像浮声,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子旋奢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 交朋友就要交那種即使變成老頭了也能互叫綽號的! 《初識RxJS》 背景 RP(Reactive Programmi...
    知行社閱讀 674評論 0 2
  • 準(zhǔn)備幫 GIT 申請吉尼斯世界紀(jì)錄泳挥,申請項(xiàng)目是 《人類能夠用命令行操作的最為復(fù)雜的軟件項(xiàng)目》。 《趣談 | Jav...
    知行社閱讀 913評論 0 4
  • 我早年都是用 VIM 寫程序至朗,也說不上特別喜歡屉符,主要是當(dāng)時(shí)還不知道怎么退出 VIM 《《深入理解ES6》教程學(xué)習(xí)筆...
    知行社閱讀 791評論 0 7
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,365評論 0 17
  • 當(dāng)一個(gè)軟件工程師宣稱他已經(jīng)完成了 90% 的工作锹引,意思是他還需要相同的時(shí)間來完成剩下的 10% 的工作矗钟。 《用程序...
    知行社閱讀 769評論 0 4