摘要:模式是什么設(shè)計(jì)模式是在軟件設(shè)計(jì)過程中針對特定問題的簡潔而優(yōu)雅的解決方案。模式的意義設(shè)計(jì)模式的意義是讓人們寫出可復(fù)用和可維護(hù)性高的程序。所有設(shè)計(jì)模式的實(shí)現(xiàn)都遵循一條原則,即找出程序中變化的地方,并將變化封裝起來。
模式是什么
設(shè)計(jì)模式是:在軟件設(shè)計(jì)過程中針對「特定」問題的「簡潔而優(yōu)雅」的解決方案。
在軟件開發(fā)的歷史中,沉淀了一些好的軟件設(shè)計(jì),而設(shè)計(jì)模式便是給這些好設(shè)計(jì)取了個(gè)名字?!负玫脑O(shè)計(jì)」并不是某人發(fā)明的。一個(gè)稍有經(jīng)驗(yàn)的程序員也許在不知不覺中數(shù)次使用過這些設(shè)計(jì)模式。
模式的意義設(shè)計(jì)模式的意義是讓人們寫出可復(fù)用和可維護(hù)性高的程序。
舉個(gè)例子,假設(shè)有一個(gè)空房間,我們要日復(fù)一日地往里面放一些東西。最簡單的辦法當(dāng)然是把這些東西直接扔進(jìn)去,但是時(shí)間久了,就會(huì)發(fā)現(xiàn)很難從這個(gè)房子里找到自己想要的東西,要調(diào)整某幾樣?xùn)|西的位置也不容易。
所以在房間里做一些柜子也許是個(gè)更好的選擇,雖然柜子會(huì)增加我們的成本,但它可以在維護(hù)階段為我們帶來好處。使用這些柜子存放東西的規(guī)則,或許就是一種模式。
所有設(shè)計(jì)模式的實(shí)現(xiàn)都遵循一條原則,即「找出程序中變化的地方,并將變化封裝起來」。
一個(gè)程序的設(shè)計(jì)總是可以分為可變的部分和不變的部分。當(dāng)我們找出可變的部分,并且把這些部分封裝起來,那么剩下的就是不變和穩(wěn)定的部分。這些不變和穩(wěn)定的部分是非常容易復(fù)用的。
熟悉這些模式的程序員,對某些模式的理解也形成了條件反射,當(dāng)合適的場景出現(xiàn)時(shí),他們可以很快地找到某種模式作為解決方案。
我們主要學(xué)習(xí)以下模式:
單例模式
策略模式
代理模式
發(fā)布訂閱模式
命令模式
狀態(tài)模式
單例模式單例模式的定義是:「保證僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)」。
單列模式場景單例模式是一種常用的模式,有一些對象我們往往只需要一個(gè),比如全局緩存、瀏覽器中的 window 對象等。
舉個(gè)前端的例子,網(wǎng)頁loading圖(菊花圖)。頁面整個(gè)生命周期,我們只需要生成一個(gè)loading就好了。既簡化了邏輯(不必去考慮多個(gè)請求打開了多個(gè)loading)又減少了dom的創(chuàng)建。
實(shí)現(xiàn)單例在javascript中,函數(shù)是一等公民,所以例子我都優(yōu)先使用函數(shù)來實(shí)現(xiàn)(原書是以面向?qū)ο蟮男问秸宫F(xiàn))
function generateInstance() { return { say() { console.log("hello") } } } let single = (function() { let instance // 哨兵變量 return function getSingle() { if (!instance) { // 如果還沒有生成實(shí)例,那么生成一個(gè)。 instance = generateInstance() } return instance } })() let a = single() let b = single() console.log(a === b) // true
以上就是一個(gè)單例的例子了。
我們利用閉包保存了一個(gè)哨兵變量,用來判斷單例是否生成。
單例模式的優(yōu)缺點(diǎn)應(yīng)用周期,只需實(shí)例化一次,對于生成實(shí)例開銷大的情況,可以提高性能。
方便管理,確保的所有的引用都是同一個(gè)實(shí)例。
實(shí)例儲(chǔ)存在閉包,是無法銷毀的。
范式下面是一個(gè)生成單例的高階函數(shù)。
var getSingle = function(fn) { var result return function() { return result || (result = fn.apply(this, arguments)) } } // 用法 let singeName = getSingle(() => `hello ${Math.random()}`) let a = singeName() let b = singeName() console.log(a === b) // true
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/100684.html
摘要:設(shè)計(jì)模式是一套被反復(fù)使用的多數(shù)人知曉的經(jīng)過分類編目的代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了重用代碼讓代碼更容易被他人理解保證代碼可靠性。由此可見,其實(shí)設(shè)計(jì)模式就是從大型軟件架構(gòu)出發(fā)便于升級(jí)和維護(hù)的軟件設(shè)計(jì)思想,它強(qiáng)調(diào)降低依賴,降低耦合。 點(diǎn)擊進(jìn)入我的博客 1.1 設(shè)計(jì)模式概述 什么是設(shè)計(jì)模式 設(shè)計(jì)模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。設(shè)計(jì)模式是一套被反復(fù)使用的、...
摘要:就像一群人完成某一項(xiàng)工作,不能一窩蜂全上,需要有組織有紀(jì)律,這個(gè)組織和紀(jì)律就是設(shè)計(jì)模式的概念。行為型設(shè)計(jì)模式用于在不同的對象之間管理算法關(guān)系以及職責(zé)結(jié)構(gòu)型設(shè)計(jì)模式用于在不同的對象之間構(gòu)造大的對象結(jié)構(gòu)。 前言:php設(shè)計(jì)模式這個(gè)系列是基于我2012年的學(xué)習(xí)筆記,共11篇,結(jié)合近幾年一些開發(fā)實(shí)踐,也參考網(wǎng)上的一些高手的文章和視頻,編輯整理而成,希望能給大家的幫助帶來一些幫助。php設(shè)計(jì)模式...
摘要:抽象工廠目的創(chuàng)建一系列相關(guān)或依賴的對象,而不指定它們的具體類。這個(gè)模式是一個(gè)真正的設(shè)計(jì)模式,因?yàn)樗裱艘蕾嚪崔D(zhuǎn)原則眾所周知這個(gè)代表了真正的面向?qū)ο蟪绦蛟O(shè)計(jì)。 【搬運(yùn)于GitHub開源項(xiàng)目DesignPatternsPHP】 項(xiàng)目地址:戳我 1、創(chuàng)建型設(shè)計(jì)模式 在軟件工程中,創(chuàng)建型設(shè)計(jì)模式承擔(dān)著對象創(chuàng)建的職責(zé),嘗試創(chuàng)建適合程序上下文的對象,對象創(chuàng)建設(shè)計(jì)模式的產(chǎn)生是由于軟件工程設(shè)計(jì)的問...
摘要:抓住了迭代器模式的本質(zhì),即是迭代,賦予了它極高的地位。輸出結(jié)果輸出結(jié)果小結(jié)迭代器模式幾乎是種設(shè)計(jì)模式中最常用的設(shè)計(jì)模式,本文主要介紹了是如何運(yùn)用迭代器模式,并介紹了模塊生成迭代器的種方法,以及種生成迭代器的內(nèi)置方法。 showImg(https://segmentfault.com/img/bVbmv7W?w=4272&h=2848); 在軟件開發(fā)領(lǐng)域中,人們經(jīng)常會(huì)用到這一個(gè)概念——設(shè)...
閱讀 1778·2023-04-25 23:43
閱讀 962·2021-11-24 09:39
閱讀 744·2021-11-22 15:25
閱讀 1744·2021-11-22 12:08
閱讀 1118·2021-11-18 10:07
閱讀 2104·2021-09-23 11:22
閱讀 3375·2021-09-22 15:23
閱讀 2608·2021-09-13 10:32