JS設(shè)計模式

39 設(shè)計模式

設(shè)計模式可以分為三大類:

  1. 結(jié)構(gòu)型模式:通過識別系統(tǒng)中組件間的簡單關(guān)系來簡化系統(tǒng)色設(shè)計
  2. 創(chuàng)建型模式:處理對象的創(chuàng)建颤难,根據(jù)實際情況使用合適的方式創(chuàng)建對象
  3. 行為型模式:用于識別對象之間常見的交互模式并加以實現(xiàn)缝裤,如此增加了這些交互的靈活性。

39.1 工廠模式

說明:你可以想象一個場景恰矩,假設(shè)有一份很復(fù)雜的代碼需要用戶去調(diào)用,但是用戶并不關(guān)心這些復(fù)雜的代碼溶推,只需要你提供一個接口去調(diào)用,用戶只負責(zé)傳遞需要的參數(shù)癣疟,至于這個參數(shù)怎么使用,內(nèi)部邏輯不用關(guān)心潮酒,只需要你最后返回一個實例,這個構(gòu)造過程就是工廠邪蛔。
工廠起到的作用就是隱藏了創(chuàng)建實例的復(fù)雜度急黎,只需要一個接口,簡單清晰侧到。

現(xiàn)實生活中的工廠按照既定的程序制造產(chǎn)品勃教,隨著生產(chǎn)原料和流程不同生產(chǎn)出來的產(chǎn)品也會有區(qū)別。應(yīng)用到軟件工廠的領(lǐng)域匠抗,工廠可以看成是一個制造其他對象的對象故源,制造出來的對象也會隨著傳入共產(chǎn)對象的參數(shù)的不同而有所區(qū)別
那么,什么時候適合使用共產(chǎn)模式而不是直接new一個對象呢汞贸?當(dāng)構(gòu)造函數(shù)過多不便管理绳军,且需要創(chuàng)建的對象之間存在某些關(guān)聯(lián)(有同一個父類,實現(xiàn)同一個接口)時矢腻,不妨使用工廠模式门驾,工廠模式提供一種集中化,統(tǒng)一化的方式多柑,避免了分散創(chuàng)建對象導(dǎo)致的代碼重復(fù)奶是、靈活性差的問題。

舉例如下:(構(gòu)造一個簡單的汽車工廠來生產(chǎn)汽車)

//汽車構(gòu)造函數(shù)
function Car1(color) {
  this.color = color
  this.brand = 'Car1'
}

//汽車構(gòu)造函數(shù)
function Car2(color) {
  this.color = color;
  this.brand = 'Car2'
}

//汽車構(gòu)造函數(shù)
function Car3(color) {
  this.color = color;
  this.brand = 'Car3'
}

//汽車的品牌
const BRANDS = {
  car1: 1,
  car2: 2,
  car3: 3
}

//汽車工廠
function createCar() {
  this.create = function (brand, color) {
    switch (brand) {
      case BRANDS.car1:
        return new Car1(color);
      case BRANDS.car2:
        return new Car2(color);
      case BRANDS.car3:
        return new Car3(color);
      default:
        break;
    }
  }
}


//測試
const carFactory = new createCar();
const cars = [];

cars.push(carFactory.create(BRANDS.car1, 'red'))
cars.push(carFactory.create(BRANDS.car2, 'greed'))
cars.push(carFactory.create(BRANDS.car3, 'pink'))

function say() {
  console.log(`Hi , I am ${this.color} and ${this.brand} car`)
}

for (const car of cars) {
  say.call(car)
}

結(jié)果如下

使用工廠模式后竣灌,不再需要重復(fù)引入一個個構(gòu)造函數(shù)聂沙,只需要引入工廠對象便可以創(chuàng)建各類對象

39.2 單例模式

單例模式的核心就是保證全局只有一個對象可以訪問,Class的實例個數(shù)最多為1初嘹,一般全局緩存及汉、全局狀態(tài)管理等待這些只需要一個對象,就可以使用單例模式削樊。 即我們只需要用一個變量確保實例只創(chuàng)建一次就可以豁生,以下為其實例:

class Singleton {
  constructor() {
  }
}
Singleton.getInstance = (function () {
  let instance;
  return function () {
  //這里使用的閉包,使用閉包保存局部作用域中的單例對象并返回
    if (!instance) {
      instance = new Singleton();
    }
    return instance;
  }
})()

let s1 = new Singleton.getInstance();
let s2 = new Singleton.getInstance();
console.log(s1 === s2) //true

設(shè)計思路:即當(dāng)instance為空時漫贞,則new創(chuàng)建新對象甸箱,若不為空時返回原來的instance對象,因此使得每次都是同一個對象

39.3 代理模式

代理是為了控制對對象的訪問迅脐,不讓外部直接訪問到對象芍殖,也有很多代理的場景。比如事件代理就用到了代理模式谴蔑。

  <ul id="ul">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
  </ul>

  <script>
    let ul = document.querySelector('#ul');
    ul.addEventListener('click', function (event) {
      console.log(event.target)
    })
  </script>

因為存在太多的li豌骏,不可能內(nèi)個都去綁定事件龟梦,這時可以通過給父節(jié)點綁定一個事件,讓父節(jié)點作為代理去拿到真實點擊的節(jié)點窃躲。

39.4 發(fā)布-訂閱者模式

發(fā)布-訂閱者模式也叫作觀察者模式计贰。通過一對一或者一對多的依賴關(guān)系,當(dāng)對象發(fā)生改變時蒂窒,訂閱方也會收到通知躁倒。

在現(xiàn)實生活中如商品缺貨時點擊有貨通知的按鈕
在實際代碼中如我們點擊一個按鈕觸發(fā)了點擊事件就是使用了觀察者模式

  let ul = document.querySelector('#ul');
    ul.addEventListener('click', function (event) {
      console.log(event.target)
    })

39.5 外觀模式

外觀模式提供一個接口,隱藏了內(nèi)部的邏輯洒琢,更加方便外部調(diào)用
比如兼容多個瀏覽器添加時間就是使用外觀模式

function addEvent(ele, ebType, fn, useCapture) {
  if (ele.addEventListener) {
    ele.addEventListener(evType, fn, useCapture);
    return true
  } else if (ele.attachEvent) {
    var r = ele.attachEvent("on" + evType, fn)
    return r;
  } else {
    //均支持這種事件綁定方式
    ele["on" + evType] = fn
  }
}

對于不同瀏覽器秧秉,添加的事件的方式可能會存在兼容問題。如果誒次都需要去這樣寫一遍的話肯定是不能接受的衰抑,所以我們將這些判斷邏輯統(tǒng)一封裝在一個接口中象迎,外部需要添加時間時只需要調(diào)用addEvent即可。
————————————————
原文鏈接:https://blog.csdn.net/weixin_46872121/article/details/111936904

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呛踊,一起剝皮案震驚了整個濱河市砾淌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恋技,老刑警劉巖拇舀,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜻底,居然都是意外死亡骄崩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門薄辅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來要拂,“玉大人,你說我怎么就攤上這事站楚⊥讯瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵窿春,是天一觀的道長拉一。 經(jīng)常有香客問我,道長旧乞,這世上最難降的妖魔是什么蔚润? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮尺栖,結(jié)果婚禮上嫡纠,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好除盏,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布叉橱。 她就那樣靜靜地躺著,像睡著了一般者蠕。 火紅的嫁衣襯著肌膚如雪窃祝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天踱侣,我揣著相機與錄音锌杀,去河邊找鬼。 笑死泻仙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的量没。 我是一名探鬼主播玉转,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼殴蹄!你這毒婦竟也來了究抓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤袭灯,失蹤者是張志新(化名)和其女友劉穎刺下,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稽荧,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡橘茉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了姨丈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畅卓。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蟋恬,靈堂內(nèi)的尸體忽然破棺而出翁潘,到底是詐尸還是另有隱情,我是刑警寧澤歼争,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布拜马,位于F島的核電站,受9級特大地震影響沐绒,放射性物質(zhì)發(fā)生泄漏俩莽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一洒沦、第九天 我趴在偏房一處隱蔽的房頂上張望豹绪。 院中可真熱鬧,春花似錦、人聲如沸瞒津。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巷蚪。三九已至病毡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屁柏,已是汗流浹背啦膜。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淌喻,地道東北人僧家。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像裸删,于是被迫代替她去往敵國和親八拱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 設(shè)計模式 單例 單例模式的核心思想是讓指定的類只存在唯一一個實例涯塔。這意味著當(dāng)你第二次使用相同的類去創(chuàng)建對象的時候肌稻,...
    代碼上的螞蟻閱讀 503評論 0 0
  • 工廠模式 單體模式 模塊模式 代理模式 職責(zé)鏈模式 命令模式 模板方法模式 策略模式 發(fā)布-訂閱模式 中介者模式 ...
    HelloJames閱讀 1,008評論 0 6
  • 設(shè)計模式是什么 設(shè)計模式就是前人總結(jié)出來的一套更加容易閱讀、維護以及復(fù)用的寫代碼的方式 模式就是一個我們?nèi)绾谓鉀Q問...
    行走的蛋白質(zhì)閱讀 149評論 0 0
  • 大家好匕荸,我是前端dog君爹谭,一名95后前端小兵。2019年畢業(yè)于北京化工大學(xué)榛搔,天津人诺凡,不知道有校友和老鄉(xiāng)嘛?對前端的...
    前端dog君閱讀 3,064評論 0 2
  • 2018任務(wù)繁重,今年打算把重點放在js的深入上,往大前端方向發(fā)展.年初有空看完了《JavaScript高級程序設(shè)...
    丶丶夏天閱讀 795評論 1 2