Node.js 設(shè)計模式筆記 —— Template 模式

Template 模式與 Strategy 模式有很多相似之處通铲。Template 模式首先會定義一個虛擬基類壮莹,描述某個組件的骨架(即通用的部分)删掀,同時令骨架中存在的某些步驟處于未定義狀態(tài)帆调。
之后由虛擬基類的子類來實現(xiàn)上述組件中缺失的未定義部分,這部分之前未定義的方法稱為 template methods迁匠。
此模式的目的在于,定義一系列屬于“同一家族”的類驹溃,能夠囊括某個組件的所有變體城丧。

UML of Template pattern

Template 和 Strategy 模式的目的是非常相似的,它們之間的區(qū)別主要在于結(jié)構(gòu)和實現(xiàn)豌鹤。
兩者都允許我們在共享組件中通用部分的同時亡哄,修改組件中變化的部分,以此形成不同的變體布疙。不同的地方在于蚊惯,Strategy 是在運行時動態(tài)實現(xiàn)的,而 Template 則在子類定義的時刻就已經(jīng)被確定了灵临。

配置管理模板

mkdir template && cd template
npm install ini
npm install objec-path

package.json

{
  "type": "module"
}

configTemplate.js

import {promises as fsPromises} from 'fs'
import objectPath from 'object-path'

export class ConfigTemplate {
  async load(file) {
    console.log(`Deserializing from ${file}`)
    this.data = this._deserialize(
      await fsPromises.readFile(file, 'utf-8')
    )
  }

  async save(file) {
    console.log(`Serializing to ${file}`)
    await fsPromises.writeFile(file, this._serialize(this.data))
  }

  get(path) {
    return objectPath.get(this.data, path)
  }

  set(path, value) {
    return objectPath.set(this.data, path, value)
  }

  _serialize() {
    throw new Error('_serialize() must be implemented')
  }

  _deserialize() {
    throw new Error(`_deserialize() must be implemented`)
  }
}

其中 configTemplate 虛擬基類實現(xiàn)了配置管理邏輯中的通用部分截型,即加載和保存文件、獲取和設(shè)置屬性儒溉。同時不對序列化和反序列化部分的邏輯進行定義宦焦,從而可以通過再創(chuàng)建不同的 Config 子類(即后面的 jsonConfiginiConfig)來實現(xiàn)具體的序列化邏輯,進而支持特定的配置文件格式顿涣。

jsonConfig.js

import {ConfigTemplate} from './configTemplate.js'

export class JsonConfig extends ConfigTemplate {
  _deserialize(data) {
    return JSON.parse(data)
  }

  _serialize(data) {
    return JSON.stringify(data, null, ' ')
  }
}

iniConfig.js

import {ConfigTemplate} from './configTemplate.js'
import ini from 'ini'

export class IniConfig extends ConfigTemplate {
  _deserialize(data) {
    return ini.parse(data)
  }

  _serialize(data) {
    return ini.stringify(data)
  }
}

index.js

import {JsonConfig} from './jsonConfig.js'
import {IniConfig} from './iniConfig.js'

async function main() {
  const jsonConfig = new JsonConfig()
  await jsonConfig.load('samples/conf.json')
  jsonConfig.set('nodejs', 'design patterns')
  await jsonConfig.save('samples/conf_mod.json')

  const iniConifg = new IniConfig()
  await iniConifg.load('samples/conf.ini')
  iniConifg.set('nodejs', 'design patterns')
  await iniConifg.save('samples/conf_mod.ini')
}

main()

參考資料

Node.js Design Patterns: Design and implement production-grade Node.js applications using proven patterns and techniques, 3rd Edition

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末波闹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涛碑,更是在濱河造成了極大的恐慌精堕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒲障,死亡現(xiàn)場離奇詭異歹篓,居然都是意外死亡瘫证,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門滋捶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痛悯,“玉大人,你說我怎么就攤上這事重窟≡孛龋” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵巡扇,是天一觀的道長扭仁。 經(jīng)常有香客問我,道長厅翔,這世上最難降的妖魔是什么乖坠? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮刀闷,結(jié)果婚禮上熊泵,老公的妹妹穿的比我還像新娘。我一直安慰自己甸昏,他們只是感情好顽分,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著施蜜,像睡著了一般卒蘸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翻默,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天缸沃,我揣著相機與錄音,去河邊找鬼修械。 笑死趾牧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的肯污。 我是一名探鬼主播武氓,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仇箱!你這毒婦竟也來了县恕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤剂桥,失蹤者是張志新(化名)和其女友劉穎忠烛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體权逗,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡美尸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年冤议,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片师坎。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡恕酸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胯陋,到底是詐尸還是另有隱情蕊温,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布遏乔,位于F島的核電站义矛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盟萨。R本人自食惡果不足惜凉翻,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捻激。 院中可真熱鬧制轰,春花似錦、人聲如沸胞谭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽韭赘。三九已至,卻和暖如春势就,著一層夾襖步出監(jiān)牢的瞬間泉瞻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工苞冯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袖牙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓舅锄,卻偏偏與公主長得像鞭达,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子皇忿,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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