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