国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript常用設(shè)計(jì)模式

RyanHoo / 930人閱讀

摘要:原文鏈接常用設(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 change
2.發(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

相關(guān)文章

  • +【13】JavaScript設(shè)計(jì)原則&&常用設(shè)計(jì)模式

    摘要:打個(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...

    opengps 評(píng)論0 收藏0
  • JavaScript常用設(shè)計(jì)模式

    摘要:前言設(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ě)代碼能用上的并不多,下面是常用的...

    mengbo 評(píng)論0 收藏0
  • 學(xué)Java編程需要注意的地方

    摘要:學(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í)才能很好的解決你面前的難題...

    leanxi 評(píng)論0 收藏0
  • ES6-7

    摘要:的翻譯文檔由的維護(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...

    mudiyouyou 評(píng)論0 收藏0
  • 個(gè)人分享--web前端學(xué)習(xí)資源分享

    摘要:前言月份開(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ì)議!那么今天我就...

    sherlock221 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<