摘要:原文鏈接常用設(shè)計(jì)模式設(shè)計(jì)模式設(shè)計(jì)模式是一種在長(zhǎng)時(shí)間的經(jīng)驗(yàn)與錯(cuò)誤中總結(jié)出來(lái)可服用的解決方案。用來(lái)模擬接口的相關(guān)操作我很帥通過(guò)適配器函數(shù)來(lái)調(diào)用目的我很帥學(xué)習(xí)資料聽(tīng)飛狐聊設(shè)計(jì)模式系列設(shè)計(jì)模式湯姆大叔
原文鏈接: JavaScript常用設(shè)計(jì)模式設(shè)計(jì)模式
設(shè)計(jì)模式是一種在長(zhǎng)時(shí)間的經(jīng)驗(yàn)與錯(cuò)誤中總結(jié)出來(lái)可服用的解決方案。
設(shè)計(jì)模式主要分為3類(lèi):創(chuàng)建型設(shè)計(jì)模式:專(zhuān)注于處理對(duì)象的創(chuàng)建
Constructor構(gòu)造器模式,F(xiàn)actory工廠模式,Singleton單例模式,builder生成器模式
結(jié)構(gòu)型設(shè)計(jì)模式:對(duì)象間組合,建立對(duì)象之間的關(guān)系
Decorator裝飾者模式,F(xiàn)acade外觀模式,F(xiàn)lyweight享元模式,Adapter適配器模式,Proxy代理模式
行為設(shè)計(jì)模式:簡(jiǎn)化和改善對(duì)象間的通信
Mediator中介者模式,Observer觀察者模式常用的設(shè)計(jì)模式 1. 觀察者模式
一個(gè)目標(biāo)對(duì)象維持著一系列依賴(lài)于它的對(duì)象,將有關(guān)狀態(tài)的任何變更自動(dòng)通知觀察者們。在觀察者模式中,觀察者需要直接訂閱目標(biāo)對(duì)象,觀察者與目標(biāo)對(duì)象之間有一定的依賴(lài)關(guān)系。
有4個(gè)重要的概念
目標(biāo)對(duì)象(被觀察者):維護(hù)一組觀察患者,提供管理觀察者的方法。
觀察者: 提供一個(gè)更新接口,用于收到通知時(shí),進(jìn)行更新
具體目標(biāo)對(duì)象:代表具體的目標(biāo)對(duì)象
具體觀察者:代表具體的觀察者
// 目標(biāo)對(duì)象 class Subject { constructor() { // 觀察者列表 this.observers = [] } addObserver(observer) { this.observers.push(observer) } removeObserver() { this.observers.pop() } notify() { this.observers.forEach(observer => { observer.update() }) } } // 觀察者 class Observer { constructor() { // 使用時(shí)會(huì)被具體update方法覆蓋 this.update = function () { // .. } } }
// 具體目標(biāo)對(duì)象 class currentSubject extends Subject { constructor() { super() } // 其他自定義方法 dosomething() { console.log("currentSubject change") this.notify() } } // 具體觀察者 class currentObserver extends Observer { constructor() { super() } // 重寫(xiě)update update() { console.log("change!") } }
// 訂閱 let curSubject = new currentSubject() let curObserver = new currentObserver() curSubject.addObserver(curObserver) // 觸發(fā) curSubject.dosomething() // currentSubject change2.發(fā)布/訂閱模式
發(fā)布訂閱模式可以說(shuō)是觀察這模式的一種變體,一種實(shí)現(xiàn)。它使用一個(gè)主題/事件通道,介于發(fā)布者和訂閱者之間,避免了發(fā)布者和訂閱者之間的依賴(lài)關(guān)系。
class PubSub { constructor() { // 主題/事件通道 this.topics = {} } publish(topic, args) { if (!this.topics[topic]) { return } let subscribers = this.topics[topic] subscribers.forEach(subscriber => { subscriber.updata(args) }) } subscribe(topic, subscriber ) { if (!this.topics[topic]) { this.topics[topic] = [] } this.topics[topic].push(subscriber ) } } let pubsub = new PubSub() pubsub.subscribe("one", subscriber ) pubsub.publish("one", "some args")3. 工廠模式
工廠函數(shù)提供一個(gè)通用的接口來(lái)創(chuàng)建對(duì)象,我們可以指定我們希望創(chuàng)建的對(duì)象類(lèi)型,我們通知工廠函數(shù)需要什么類(lèi)型的對(duì)象并提供對(duì)應(yīng)的數(shù)據(jù),返回對(duì)應(yīng)的實(shí)例。
class Car { constructor(options) { this.doors = options.doors || 4; this.state = options.state || "brand new"; this.color = options.color || "silver"; } } class Truck { constructor(options) { this.state = options.state || "used"; this.wheelSize = options.wheelSize || "large"; this.color = options.color || "blue"; } } function vehicleFactory (options) { if (options.type === "car") { return new Car(options) } else { return new Truck(options) } }
何時(shí)使用工廠模式
當(dāng)我們的對(duì)象比較復(fù)雜的時(shí)候。
當(dāng)我們需要根據(jù)不同情況創(chuàng)建不同對(duì)象實(shí)例的時(shí)候。
當(dāng)我們需要?jiǎng)?chuàng)建許多相似對(duì)象的時(shí)候。
缺點(diǎn)
使用不當(dāng)會(huì)增加程序的復(fù)雜度
4. 抽象工廠模式抽象工廠模式,將對(duì)象的實(shí)現(xiàn)細(xì)節(jié)抽離出來(lái)。適用于需要和多種對(duì)象一起工作的場(chǎng)景。
class Truck { constructor(options) { this.state = options.state || "used"; this.wheelSize = options.wheelSize || "large"; this.color = options.color || "blue"; } } class Car { constructor(options) { this.doors = options.doors || 4; this.state = options.state || "brand new"; this.color = options.color || "silver"; } } class AbstractFactory { constructor() { this.types = {} } registerFactory(type, factory) { this.types[type] = factory } getInstance(type, args) { let factory = this.types[type] if (factory) { return new factory(args) } } } let abstractFactory = new AbortController() abstractFactory.registerFactory("car", Car) abstractFactory.registerFactory("truck", Truck) abstractFactory.getInstance("car", options) abstractFactory.getInstance("truck", options)5. 單例模式
單例模式限制一個(gè)類(lèi)只有一個(gè)實(shí)例化對(duì)象。
class Obj(data) { // .... } // 利用閉包實(shí)現(xiàn)單例模式,確保obj類(lèi)只有一個(gè)實(shí)例 function singleton (data) { var instance; return function () { if (!instance) { instance = new Obj(data) } return instance } }6. 中介者模式
中介者模式就是提供一個(gè)中心點(diǎn)給系統(tǒng)不同組件之間進(jìn)行通信,降低系統(tǒng)組件之間的耦合程度。
// 實(shí)現(xiàn)與發(fā)布/訂閱模式類(lèi)似
觀察者模式和發(fā)布訂閱模式專(zhuān)注于維護(hù)目標(biāo)對(duì)象和觀察者之間的關(guān)系,當(dāng)主題對(duì)象發(fā)送變化時(shí),通知所有對(duì)改主題感興趣的觀察者。而中介者模式的話,專(zhuān)注于限制對(duì)象的通信必須通過(guò)中介者來(lái)通信。兩者都提倡松耦合。
7. 裝飾者模式裝飾者模式,通過(guò)一個(gè)裝飾類(lèi)對(duì)現(xiàn)有動(dòng)態(tài)添加行為,以及對(duì)原有行為進(jìn)行裝飾。
// o為已有對(duì)象 var M20 = function(o){ // 這里定義一個(gè)裝飾類(lèi) var str = "20多歲的時(shí)候,"; // o是傳入的對(duì)象,調(diào)用傳入對(duì)象的方法,加以裝飾 this.eat = function(){ return str + o.eat()+",肥得很!"; }; this.drink = function(){ return str + o.drink()+",就是個(gè)水桶!"; }; this.coding = function(){ return str + o.coding()+",代碼又寫(xiě)得撇!"; }; } alert(new M20(david).eat()); // 20多歲的時(shí)候,大衛(wèi)是個(gè)大胖子,一天只曉得吃,肥得很! alert(new M20(david).drink()); // 20多歲的時(shí)候,大衛(wèi)除了吃就是喝,就是個(gè)水桶! alert(new M20(david).coding()); // 20多歲的時(shí)候,寫(xiě)代碼吧,大衛(wèi),代碼又寫(xiě)得撇!8. 適配器模式
使用一個(gè)新的接口對(duì)現(xiàn)有的接口進(jìn)行包裝,處理數(shù)據(jù)與接口的不匹配。
function api (x1, x2, x3) { console.log(x1 + x2 + x3); // 用console.log來(lái)模擬接口的相關(guān)操作 } var data = { a: "我", b: "很", c: "帥" } function adapterApi (o) { // 通過(guò)適配器函數(shù)來(lái)調(diào)用目的api api(o.a, o.b, o.c); } adapterApi(data); // 我很帥
學(xué)習(xí)資料:
聽(tīng)飛狐聊JavaScript設(shè)計(jì)模式系列
javascript設(shè)計(jì)模式
湯姆大叔
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/95824.html
摘要:打個(gè)比方源碼使用了模式,解決了問(wèn)題,但是,在選擇模式解決問(wèn)題的背后又有多少思考 showImg(https://segmentfault.com/img/bVbupTE?w=480&h=260); 【前言】 最近閱讀了《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》,收獲頗豐,于是想寫(xiě)一點(diǎn)總結(jié)及感想 showImg(https://segmentfault.com/img/bVbupUE?w...
摘要:前言設(shè)計(jì)模式幾十種,閱讀了設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐這本書(shū)后,個(gè)人感覺(jué)就是圍繞對(duì)象來(lái)設(shè)計(jì)的,發(fā)現(xiàn)日常寫(xiě)代碼能用上的并不多,下面是常用的幾種設(shè)計(jì)模式。前端服務(wù)端可以參考我的另一個(gè)倉(cāng)庫(kù)地址,一個(gè)簡(jiǎn)單的實(shí)時(shí)聊天參考來(lái)自設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐讀書(shū)筆記 前言 設(shè)計(jì)模式幾十種,閱讀了《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》這本書(shū)后,個(gè)人感覺(jué)js就是圍繞對(duì)象來(lái)設(shè)計(jì)的,發(fā)現(xiàn)日常寫(xiě)代碼能用上的并不多,下面是常用的...
摘要:學(xué)編程真的不是一件容易的事不管你多喜歡或是多會(huì)編程,在學(xué)習(xí)和解決問(wèn)題上總會(huì)碰到障礙。熟練掌握核心內(nèi)容,特別是和多線程初步具備面向?qū)ο笤O(shè)計(jì)和編程的能力掌握基本的優(yōu)化策略。 學(xué)Java編程真的不是一件容易的事,不管你多喜歡或是多會(huì)Java編程,在學(xué)習(xí)和解決問(wèn)題上總會(huì)碰到障礙。工作的時(shí)間越久就越能明白這個(gè)道理。不過(guò)這倒是一個(gè)讓人進(jìn)步的機(jī)會(huì),因?yàn)槟阋恢辈粩嗟膶W(xué)習(xí)才能很好的解決你面前的難題...
摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書(shū)了入門(mén),覺(jué)得看看這本書(shū)就足夠了。前端的異步解決方案之和異步編程模式在前端開(kāi)發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(shū)(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書(shū)的目的是以目前還在制定中的ECMASc...
摘要:前言月份開(kāi)始出沒(méi)社區(qū),現(xiàn)在差不多月了,按照工作的說(shuō)法,就是差不多過(guò)了三個(gè)月的試用期,準(zhǔn)備轉(zhuǎn)正了一般來(lái)說(shuō),差不多到了轉(zhuǎn)正的時(shí)候,會(huì)進(jìn)行總結(jié)或者分享會(huì)議那么今天我就把看過(guò)的一些學(xué)習(xí)資源主要是博客,博文推薦分享給大家。 1.前言 6月份開(kāi)始出沒(méi)社區(qū),現(xiàn)在差不多9月了,按照工作的說(shuō)法,就是差不多過(guò)了三個(gè)月的試用期,準(zhǔn)備轉(zhuǎn)正了!一般來(lái)說(shuō),差不多到了轉(zhuǎn)正的時(shí)候,會(huì)進(jìn)行總結(jié)或者分享會(huì)議!那么今天我就...
閱讀 2086·2021-11-23 10:13
閱讀 2794·2021-11-09 09:47
閱讀 2739·2021-09-22 15:08
閱讀 3317·2021-09-03 10:46
閱讀 2233·2019-08-30 15:54
閱讀 915·2019-08-28 18:09
閱讀 2431·2019-08-26 18:26
閱讀 2342·2019-08-26 13:48