摘要:注意事項(xiàng)聲明函數(shù)時(shí)候處理業(yè)務(wù)邏輯區(qū)分和單例的區(qū)別,配合單例實(shí)現(xiàn)初始化構(gòu)造函數(shù)大寫(xiě)字母開(kāi)頭推薦注意的成本。簡(jiǎn)單工廠模式使用一個(gè)類(lèi)通常為單體來(lái)生成實(shí)例。
@(書(shū)籍閱讀)[JavaScript, 設(shè)計(jì)模式]
常見(jiàn)設(shè)計(jì)模式一直對(duì)設(shè)計(jì)模式不太懂,花了一下午加一晚上的時(shí)間,好好的看了看各種設(shè)計(jì)模式,并總結(jié)了一下。
設(shè)計(jì)模式簡(jiǎn)介設(shè)計(jì)模式概念解讀
設(shè)計(jì)模式的發(fā)展與在JavaScript中的應(yīng)用
設(shè)計(jì)原則
設(shè)計(jì)模式概念解讀設(shè)計(jì)模式(Design pattern):
>是一套被反復(fù)使用,思想成熟,經(jīng)過(guò)分類(lèi)和無(wú)數(shù)實(shí)戰(zhàn)設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了讓系統(tǒng)代碼可重用,可擴(kuò)展,可解耦,更容易被人理解且能保證代碼可靠性。設(shè)計(jì)模式使代碼開(kāi)發(fā)真正工程化;設(shè)計(jì)模式是軟件工程的基石脈絡(luò),如同大廈的結(jié)構(gòu)一樣。只有夯實(shí)地基搭好結(jié)構(gòu),才能蓋出堅(jiān)壯的大樓。也是我們邁向高級(jí)開(kāi)發(fā)人員必經(jīng)的一步。
一層書(shū)柜--》兩層書(shū)柜--》各種書(shū)柜分門(mén)別類(lèi)
設(shè)計(jì)模式的發(fā)展與在JavaScript中的運(yùn)用四人幫的書(shū),設(shè)計(jì)模式的圣經(jīng)Gof
編程語(yǔ)言之間是想通的;
很多本該有的東西JavaScript都有,但是并沒(méi)有作為正式的部分。這些年人們利用自己對(duì)計(jì)算機(jī)編程的思想,利用了很多晦澀的技巧實(shí)現(xiàn)了很多JavaScript設(shè)計(jì)者都未曾預(yù)計(jì)到的任務(wù),比如各種設(shè)計(jì)模式的實(shí)現(xiàn),比如面向?qū)ο蟮木幊獭?/p>
設(shè)計(jì)原則
設(shè)計(jì)模式的根本原因是為了代碼復(fù)用,增加可維護(hù)性。有如下原則:
【開(kāi)閉原則】:對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉;
【里氏轉(zhuǎn)換原則】:子類(lèi)繼承父類(lèi),多帶帶調(diào)用完全可以運(yùn)行;
【依賴倒轉(zhuǎn)原則】:引用一個(gè)對(duì)象,如果這個(gè)對(duì)象有底層類(lèi)型,直接引用底層;
【結(jié)構(gòu)隔離原則】:每一個(gè)接口應(yīng)該是一種角色;
【合成/聚合復(fù)用原則】:新對(duì)象應(yīng)該使用一些已有的對(duì)象,使之成為新對(duì)象的一部分;
【迪米特原則】:一個(gè)對(duì)象應(yīng)該對(duì)其它對(duì)象有盡可能少的了解;
站在巨人的肩膀上整體HOLD系統(tǒng)架構(gòu)。
單例就是保證一個(gè)類(lèi)只有一個(gè)實(shí)例,實(shí)現(xiàn)的方法一般是先判斷實(shí)例存在與否,如果存在則直接返回,如果不存在就創(chuàng)建了再返回,這就確保了一個(gè)類(lèi)只有一個(gè)實(shí)例對(duì)象。
在JavaScript中,單例作為一個(gè)命名空間提供者,從全局命名空間里提供一個(gè)唯一的訪問(wèn)點(diǎn)來(lái)訪問(wèn)該對(duì)象。
比如說(shuō)一座房子只有一扇門(mén),有一扇門(mén)就不用再開(kāi)門(mén)了,如果沒(méi)有門(mén)則需要?jiǎng)?chuàng)建一個(gè)門(mén)。每個(gè)門(mén)都只屬于一個(gè)戶主(命名空間),門(mén)是戶與戶之間的唯一接口,你要來(lái)我家,只能從這個(gè)門(mén)進(jìn)來(lái)。
命名空間:
單例模式作用和注意事項(xiàng)通常來(lái)說(shuō),命名空間是唯一識(shí)別的一套名字,這樣當(dāng)對(duì)象來(lái)自不同的地方但是名字相同的時(shí)候就不會(huì)含糊不清了。
模塊間通信;
系統(tǒng)中某個(gè)類(lèi)的對(duì)象只能存在一個(gè);
保護(hù)自己的屬性和方法(不受外面的干擾);
注意this的使用:隨著調(diào)用不斷變化,誰(shuí)調(diào)用指向誰(shuí);
閉包容易造成內(nèi)存泄露,不需要的趕快干掉:閉包就是拿到不該拿到的東西,return;
注意new的成本。(繼承)
單例模式代碼實(shí)戰(zhàn)和總結(jié)var single = (function() { var unique; function getInstance() { if (unique === undefined) { unique = new Construct(); } return unique; } function Construct() { // ... 生成單例的構(gòu)造函數(shù)的代碼 } return { getInstance: getInstance } })();構(gòu)造函數(shù)模式 構(gòu)造模式概念解讀
構(gòu)造函數(shù)用于創(chuàng)建特定類(lèi)型的對(duì)象-不僅聲明了使用的對(duì)象,構(gòu)造函數(shù)還可以接收參數(shù)以便第一次創(chuàng)建對(duì)象的時(shí)候設(shè)置對(duì)象的成員值??梢宰远x構(gòu)造函數(shù),然后在里面聲明自定義類(lèi)型對(duì)象的屬性和方法;
在JavaScript里,構(gòu)造函數(shù)通常是認(rèn)為用來(lái)實(shí)現(xiàn)實(shí)例的,JavaScript沒(méi)有類(lèi)的概念,但是有特殊的構(gòu)造函數(shù)。通過(guò)new關(guān)鍵字來(lái)調(diào)用自定義的構(gòu)造函數(shù),在構(gòu)造函數(shù)內(nèi)部,this關(guān)鍵字引用的是新創(chuàng)建的對(duì)象。
每家都有一個(gè)門(mén),但是每個(gè)門(mén)都有自己的特點(diǎn),可以根據(jù)自己的需要添加不同的特點(diǎn)(傳入不同的值)。
構(gòu)造模式作用和注意事項(xiàng)用于創(chuàng)建特點(diǎn)類(lèi)型的對(duì)象:給某一個(gè)人
第一次聲明的時(shí)候給對(duì)象賦值;
自己聲明構(gòu)造函數(shù),賦予屬性和方法;(告訴別人自己想要怎么樣的門(mén)。)
聲明函數(shù)時(shí)候處理業(yè)務(wù)邏輯;
區(qū)分和單例的區(qū)別,配合單例實(shí)現(xiàn)初始化;
構(gòu)造函數(shù)大寫(xiě)字母開(kāi)頭(推薦~)
注意new的成本。(繼承)(相同的盡量放在原型鏈上)
構(gòu)造模式實(shí)戰(zhàn)與總結(jié)最簡(jiǎn)單的構(gòu)造函數(shù):
function Car(model, year, miles) { this.model = model; this.year = year; this.miles = miles; this.output= function () { return this.model + "走了" + this.miles + "公里"; }; } var tom= new Car("大叔", 2009, 20000); var dudu= new Car("Dudu", 2010, 5000); console.log(tom.output()); console.log(dudu.output());
強(qiáng)制使用new的方法:
function Car(model, year, miles) { if (!(this instanceof Car)) { return new Car(model, year, miles); } this.model = model; this.year = year; this.miles = miles; this.output = function () { return this.model + "走了" + this.miles + "公里"; } } var tom = new Car("大叔", 2009, 20000); var dudu = Car("Dudu", 2010, 5000); console.log(typeof tom); // "object" console.log(tom.output()); // "大叔走了20000公里" console.log(typeof dudu); // "object" console.log(dudu.output()); // "Dudu走了5000公里"建造者模式 建造者模式概念解讀
建造者模式可以將一個(gè)復(fù)雜對(duì)象的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。也就是說(shuō),如果我們用了建造者模式,那么用戶就需要指定需要建造的類(lèi)型就可以得到它們,而具體建造的過(guò)程和細(xì)節(jié)就不需要知道了。建造者模式實(shí)際,就是一個(gè)指揮者,一個(gè)建造者,一個(gè)使用指揮者調(diào)用具體建造者工作得出結(jié)果給客戶。
建造者模式主要用于“分步驟構(gòu)建一個(gè)復(fù)雜的對(duì)象”,“分步驟”是一個(gè)穩(wěn)定的算法,而復(fù)雜對(duì)象的各個(gè)部分則經(jīng)常變化。
說(shuō)一戶家人要建房子,但房子主人或家里其他人是不懂得如何去建房子的,所以他得去請(qǐng)幾個(gè)工人,這個(gè)建房子的隊(duì)伍還得有個(gè)工頭,來(lái)按房主人的想法來(lái)建一套房子,工頭按房主人的要求設(shè)計(jì)要求工人如何如何做;
工頭說(shuō),第一步先把房整體骨架搭起來(lái),第二步睡房建造好,第三步把廚房裝飾好,第四步把客廳建造裝飾完畢,第五步...
工頭是不做事的,但具體建造者必須按照工頭的要求來(lái)做,第一步,第二步的這樣步驟來(lái)建造,直至整個(gè)房子完成;
創(chuàng)建者必須要有創(chuàng)建這個(gè)房屋的所有技能,即建骨架,裝飾睡房等...,即建造者所做的事,或所具有的能力,必須大于或等于指揮者要求要做的事,或具有的能力;
即指揮者是個(gè)組織者,而建造者提供技能;
建造者模式作用和注意事項(xiàng)模式作用:
分布構(gòu)建一個(gè)復(fù)雜的對(duì)象(包工頭對(duì)工人,工人對(duì)房子);
解耦封裝過(guò)程和具體構(gòu)建的組件;
無(wú)需關(guān)心組件如何組裝;
各司其職,拆解流程;
注意事項(xiàng):
一定要有一個(gè)穩(wěn)定的算法進(jìn)行支持(合同);
加工工藝是暴露的(可以直接找工人,但是包工頭更熟悉);
建造者模式代碼實(shí)戰(zhàn)和總結(jié)工人建造者X:
function workerBuilder() { this.workOne = function() { //建房子骨架 } this.workTwo=function() { //建睡房 } this.workThree=function() { //建廚房 } this.workFour=function() { //建客廳 } //.... this.getResult = function() { //建成房子 var house = new House(); //house.HouseFrame ... return house; } }
workBuilder 是具體建造者類(lèi),workOne, Two是要做的事情,建骨架等;
當(dāng)然 workBuilder 可以多建幾個(gè),用于表示 工人 對(duì)于每個(gè)工作執(zhí)行的方法不一樣;但工作內(nèi)容是一樣的;
指揮者類(lèi)
function Director() { this.construct = function(builder) { builder.workOne(); builder.workTwo(); builder.workThree(); builder.workFour(); //... //上面的內(nèi)容,順序可設(shè)置,并且工作項(xiàng)也可以設(shè)定 } }
指揮者類(lèi)下的 指導(dǎo) 方法,有對(duì) 建造者 的回調(diào)引用,內(nèi)容包括建者工作內(nèi)容幾項(xiàng)或全部; 指揮者對(duì)建造者工人要做的事情進(jìn)行組織跟安排;
產(chǎn)品房子
function House() { this.HouseFrame = ""; this.Room = ""; this.Kitchen = ""; this.LivingRoom = ""; //... }
使用方法
var builder = new workBuilder(); var director = new Director(); director.construct(builder); var house = builder.getResult();
第四步,整個(gè)使用相當(dāng)于客戶:房主人,房主人請(qǐng) Director 工頭來(lái)建房子,但是工頭是不做事的,所以他指揮 builder 工個(gè)來(lái)建子,最后房主人從工人那里取得建好的房子;
工廠模式 工廠模式概念解讀工廠模式定義了一個(gè)用于創(chuàng)建對(duì)象的接口,這個(gè)接口決定了實(shí)例化哪一個(gè)類(lèi)。該模式使一個(gè)類(lèi)的實(shí)例化延遲到了子類(lèi)。而子類(lèi)可以重寫(xiě)接口方法以便創(chuàng)建的時(shí)候指定自己的對(duì)象類(lèi)型(抽象工廠)。(簡(jiǎn)單工廠:能找到具體細(xì)節(jié));抽象工廠只留口,不做事,留給外界覆蓋;
這個(gè)模式十分有用,尤其是創(chuàng)建對(duì)象的流程賦值的時(shí)候,比如依賴于很多設(shè)置文件等。并且,會(huì)經(jīng)常在程序里看到工廠方法,用于讓子類(lèi)定義需要?jiǎng)?chuàng)建的對(duì)象類(lèi)型。
簡(jiǎn)單工廠模式:使用一個(gè)類(lèi)(通常為單體)來(lái)生成實(shí)例。
復(fù)雜工廠模式:使用子類(lèi)來(lái)決定一個(gè)成員變量應(yīng)該是哪個(gè)具體的類(lèi)的實(shí)例。
廠里可以做衣服可以做鞋,按訂單來(lái)生產(chǎn)那種東西,通過(guò)廠長(zhǎng)安排那條產(chǎn)品線,外界可以修改產(chǎn)品線工藝(抽象工廠)。廠長(zhǎng)只是告訴做什么事,
工廠模式的作用和注意事項(xiàng)作用:
對(duì)象的構(gòu)建十分復(fù)雜;
需要依賴具體的環(huán)境創(chuàng)建不同實(shí)例;
處理大量具有相同屬性的小對(duì)象;
注意事項(xiàng):
不能濫用工廠,有時(shí)候僅僅是給代碼增加復(fù)雜度;
工廠模式代碼實(shí)戰(zhàn)簡(jiǎn)單工廠模式:
var BicycleFactory = { createBicycle : function( model ){ var bicycle; switch( model ){ case "The Speedster": bicycle = new Speedster(); break; case "The Lowrider": bicycle = new Lowrider(); break; case "The Cruiser": default: bicycle = new Cruiser(); break; } return bycicle; } }
BicycleFactory 是一個(gè)脫離于BicycleShop的單體。降低耦合度的效果顯而易見(jiàn)。當(dāng)需要添加新的類(lèi)型的時(shí)候,不需要?jiǎng)?BicycleShop 只需修改工廠單體對(duì)象就可以。
var BicycleShop = function(){}; BicycleShop.prototype = { sellBicycle : function( model ){ var bicycle = BicycleFactory.createBicycle(model); return bicycle; } }
工廠模式:
真正的工廠模式與簡(jiǎn)單工廠模式相比,主要區(qū)別就是它不是另外使用一個(gè)對(duì)象或者類(lèi)來(lái)創(chuàng)建實(shí)例(自行車(chē)),而是使用一個(gè)子類(lèi)。工廠是一個(gè)將其成員對(duì)象的實(shí)例化推遲到子類(lèi)中進(jìn)行的類(lèi)。
比如加入BicycleShop可以決定從那一家廠商進(jìn)行進(jìn)貨,那么簡(jiǎn)單的一個(gè)BicycleFactory是不夠了的,因?yàn)楦鱾€(gè)廠商會(huì)各自生產(chǎn)不同的Speedster,Lowrider,Cruiser等型號(hào)自行車(chē),所以首先需要生成各自廠商的shop實(shí)例,不同廠商的shop實(shí)例擁有不同的生成幾個(gè)型號(hào)自行車(chē)的方法。
也就是相當(dāng)于將自行車(chē)對(duì)象的實(shí)例化推遲到了shop實(shí)例中產(chǎn)生。
基礎(chǔ):
var BicycleShop = function(){} BicycleShop.prototype={ sellBicycle: function( model ){ var bicycle = this.createBicycle( model ); return bicycle; }, createBicycle: function( model ){ throw new Error( " Unsupported " ); } }
各自廠商:
var AcmeBicycleShop = function(){}; extend( AcmeBicycleShop , BicycleShop ); AcmeBicycleShop.prototype.createBicycle = function( model ){ var bicycle; switch( model ){ case "The Speedster": bicycle = new AcmeSpeedster(); break; case "The Lowrider": bicycle = new AcmeLowrider(); break; case "The Cruiser": default: bicycle = new AcmeCruiser(); break; } return bicycle; } var GeneralBicycleShop = function(){}; extend( GeneralBicycleShop , BicycleShop ); GeneralBicycleShop.prototype.createBicycle = function( model ){ ... }
那么接下來(lái)就很簡(jiǎn)單 對(duì)于來(lái)自 Acme 進(jìn)貨的
var acmeShop = new AcmeBicycleShop(); var newBicycle = acmeShop.sellBicycle("The Speedster");
當(dāng)然,你也可以對(duì)于外層生成的子類(lèi)實(shí)例在使用簡(jiǎn)單工廠模式進(jìn)行包裝一下~對(duì)于添加其他廠商也很簡(jiǎn)單,在創(chuàng)建一個(gè)Bicycle的子類(lèi)重新定義其createBicycle的工廠方法即可。
工廠模式使用場(chǎng)合動(dòng)態(tài)實(shí)現(xiàn)
例如自行車(chē)的例子,創(chuàng)建一些用不同方式實(shí)現(xiàn)統(tǒng)一接口的對(duì)象,那么可以使用一個(gè)工廠方法或者簡(jiǎn)單工廠對(duì)象來(lái)簡(jiǎn)化實(shí)現(xiàn)過(guò)程。選擇可以是明確進(jìn)行的也可以是隱含的。
節(jié)省設(shè)置開(kāi)銷(xiāo)
如果對(duì)象要進(jìn)行復(fù)雜的并且彼此相關(guān)的設(shè)置的時(shí)候,那么工廠模式可以很顯著的減少每種對(duì)象的代碼量。將特定的設(shè)置代碼提取出來(lái)會(huì)使得代碼有極大地提升。并且能優(yōu)化結(jié)構(gòu)便于維護(hù)。
用于許多小型對(duì)象組成一個(gè)大對(duì)象。
工廠模式之利
主要好處就是可以消除對(duì)象間的耦合,通過(guò)使用工程方法而不是new關(guān)鍵字。將所有實(shí)例化的代碼集中在一個(gè)位子防止代碼重復(fù)。
工廠模式之弊
大多數(shù)類(lèi)最好使用new關(guān)鍵字和構(gòu)造函數(shù),可以讓代碼更加簡(jiǎn)單易讀。而不必去查看工廠方法來(lái)知道。
代理:顧名思義就是幫組別人做事,GoF對(duì)代理模式的定義如下:
代理模式(Proxy),為其它對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。代理模式是的代理對(duì)象控制具體對(duì)象的引用。代理幾乎可以是任何對(duì)象:文件,資源,內(nèi)存中的對(duì)象,或者是一些難以復(fù)制的東西。
中介
經(jīng)理把收集日?qǐng)?bào)周報(bào)反饋給大老板;
卡扣通過(guò)中間的黃色東西連接在一起;
代理模式作用和注意點(diǎn)模式作用:
遠(yuǎn)程代理(一個(gè)對(duì)象將不同空間的對(duì)象進(jìn)行局部代理);
虛擬代理(根據(jù)需要?jiǎng)?chuàng)建開(kāi)銷(xiāo)很大的對(duì)象如渲染網(wǎng)頁(yè)暫時(shí)用占位符替代真圖);
安全代理(控制真實(shí)對(duì)象的訪問(wèn)權(quán)限);
智能指引(調(diào)用對(duì)象代理處理另外一些事情如垃圾回收機(jī)制);
注意事項(xiàng):
不能濫用代理,有時(shí)候僅僅是給代碼增加復(fù)雜度;
代理模式實(shí)戰(zhàn)代理模式需要三方:
小v和狼貓有點(diǎn)誤會(huì),由大熊君幫著緩和一下誤會(huì)慢慢解除了。
function XiaoV(){ this.talk = function(){ console.log("狼貓老弟,不好意思上次的事,請(qǐng)多多諒解。") ; } ; } ; function LangMao(){ this.bb = new BigBear() ; this.talk = function(){ console.log("大熊君好啊,最忌忙什么那?") ; this.bb.talk() ; } ; } ; function BigBear(){ this.xiaov = new XiaoV() ; this.talk = function(){ console.log("狼貓兄弟,中午沒(méi)事一起吃頓飯聊聊天,那天我見(jiàn)到小v了,他優(yōu)化和你說(shuō)。。。。。。") ; this.xiaov.talk() ; } ; } ; function go(){ new LangMao().talk() ; } ;
抽象角色:聲明真實(shí)對(duì)象和代理對(duì)象的共同接口。
代理角色:代理對(duì)象角色內(nèi)部含有對(duì)真實(shí)對(duì)象的引用,從而可以操作真實(shí)對(duì)象,同時(shí)代理對(duì)象提供與真實(shí)對(duì)象相同的接口以便在任何時(shí)刻都能代替真實(shí)對(duì)象。同時(shí),代理對(duì)象可以在執(zhí)行真實(shí)對(duì)象操作時(shí),附加其他的操作,相當(dāng)于對(duì)真實(shí)對(duì)象進(jìn)行封裝。
真實(shí)角色:代理角色所代表的真實(shí)對(duì)象,是我們最終要引用的對(duì)象。
代理模式的一個(gè)好處就是對(duì)外部提供統(tǒng)一的接口方法,而代理類(lèi)在接口中實(shí)現(xiàn)對(duì)真實(shí)類(lèi)的附加操作行為,從而可以在不影響外部調(diào)用情況下,進(jìn)行系統(tǒng)擴(kuò)展。也就是說(shuō),我要修改真實(shí)角色的操作的時(shí)候,盡量不要修改他,而是在外部在“包”一層進(jìn)行附加行為,即代理類(lèi)。
當(dāng)我們需要使用的對(duì)象很復(fù)雜或者需要很長(zhǎng)時(shí)間去構(gòu)造,這時(shí)就可以使用代理模式(Proxy)。例如:如果構(gòu)建一個(gè)對(duì)象很耗費(fèi)時(shí)間和計(jì)算機(jī)資源,代理模式(Proxy)允許我們控制這種情況,直到我們需要使用實(shí)際的對(duì)象。一個(gè)代理(Proxy)通常包含和將要使用的對(duì)象同樣的方法,一旦開(kāi)始使用這個(gè)對(duì)象,這些方法將通過(guò)代理(Proxy)傳遞給實(shí)際的對(duì)象。 一些可以使用代理模式(Proxy)的情況:
一個(gè)對(duì)象,比如一幅很大的圖像,需要載入的時(shí)間很長(zhǎng)。
一個(gè)需要很長(zhǎng)時(shí)間才可以完成的計(jì)算結(jié)果,并且需要在它計(jì)算過(guò)程中顯示中間結(jié)果
一個(gè)存在于遠(yuǎn)程計(jì)算機(jī)上的對(duì)象,需要通過(guò)網(wǎng)絡(luò)載入這個(gè)遠(yuǎn)程對(duì)象則需要很長(zhǎng)時(shí)間,特別是在網(wǎng)絡(luò)傳輸高峰期。
一個(gè)對(duì)象只有有限的訪問(wèn)權(quán)限,代理模式(Proxy)可以驗(yàn)證用戶的權(quán)限
命令模式 概念解讀命令模式(Command):
用來(lái)對(duì)方法調(diào)用進(jìn)行參數(shù)化處理和傳送,經(jīng)過(guò)這樣處理過(guò)的方法調(diào)用可以在任何時(shí)候執(zhí)行。也就是說(shuō)該模式旨在將函數(shù)的調(diào)用,請(qǐng)求和操作封裝成一個(gè)單一的對(duì)象,然后對(duì)這個(gè)對(duì)象進(jìn)行一系列的處理。它也可以用來(lái)消除調(diào)用操作的對(duì)象和實(shí)現(xiàn)操作的對(duì)象之間的耦合。這為各種具體的類(lèi)的更換帶來(lái)了極大的靈活性。
模式作用:
將函數(shù)的封裝,請(qǐng)求,調(diào)用結(jié)合為一體;
調(diào)用具體的函數(shù)解耦命令對(duì)象和接收對(duì)象;
提高程序模塊的靈活性;
注意事項(xiàng):
不需要借口一致,直接調(diào)用函數(shù)即可,以免造成浪費(fèi);
實(shí)戰(zhàn)// 命令
var CreateCommand = function( receiver ){ this.receiver = receiver; } CreateCommand.prototype.execute = function() { this.receiver.action(); }
// 接收者 電視
var TVOn = function() {} TVOn.prototype.action = function() { alert("TVOn"); }
// 接收者 電視
var TVOff = function() {} TVOff.prototype.action = function() { alert("TVOff"); }
// 調(diào)用者 遙控器
var Invoker = function( tvOnCommand, tvOffCommand ) { this.tvOnCommand = tvOnCommand; this.tvOffCommand = tvOffCommand; } Invoker.prototype.tvOn = function() { this.tvOnCommand.execute(); } Invoker.prototype.tvOff = function() { this.tvOffCommand.execute(); }
執(zhí)行Client
var tvOnCommand = new CreateCommand( new TVOn() ); var tvOffCommand = new CreateCommand( new TVOff() ); var invoker = new Invoker( tvOnCommand, tvOffCommand ); invoker.tvOn(); invoker.tvOff();參考文獻(xiàn)
深入理解JavaScript系列(26):設(shè)計(jì)模式之構(gòu)造函數(shù)模式
[設(shè)計(jì)模式] javascript 之 建造者模式
JS設(shè)計(jì)模式二:工廠模式
大熊君說(shuō)說(shuō)JS與設(shè)計(jì)模式之------代理模式Proxy
【JS設(shè)計(jì)模式】命令模式
極客學(xué)院《JS設(shè)計(jì)模式》系列視頻
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78837.html
摘要:前言是瀏覽器的內(nèi)置腳本語(yǔ)言。避免,在結(jié)構(gòu)生成之前調(diào)用節(jié)點(diǎn),而產(chǎn)生錯(cuò)誤 前言 JavaScript是瀏覽器的內(nèi)置腳本語(yǔ)言。當(dāng)網(wǎng)頁(yè)中嵌入了JavaScript腳本,瀏覽器加載網(wǎng)頁(yè)時(shí),就會(huì)執(zhí)行腳本,從而操作瀏覽器,實(shí)現(xiàn)各種動(dòng)態(tài)效果 JavaScript代碼嵌入網(wǎng)頁(yè)的方法 1、元素直接嵌入代碼 function sayHello() { alert(hello!); ...
摘要:前言是瀏覽器的內(nèi)置腳本語(yǔ)言。避免,在結(jié)構(gòu)生成之前調(diào)用節(jié)點(diǎn),而產(chǎn)生錯(cuò)誤 前言 JavaScript是瀏覽器的內(nèi)置腳本語(yǔ)言。當(dāng)網(wǎng)頁(yè)中嵌入了JavaScript腳本,瀏覽器加載網(wǎng)頁(yè)時(shí),就會(huì)執(zhí)行腳本,從而操作瀏覽器,實(shí)現(xiàn)各種動(dòng)態(tài)效果 JavaScript代碼嵌入網(wǎng)頁(yè)的方法 1、元素直接嵌入代碼 function sayHello() { alert(hello!); ...
摘要:邏輯非可以應(yīng)用于中的任何值無(wú)論這個(gè)值是什么數(shù)據(jù)類(lèi)型,這個(gè)操作符都會(huì)返回一個(gè)布爾值邏輯非操作符首相會(huì)將它的操作數(shù)轉(zhuǎn)化成一個(gè)布爾值,然后對(duì)其求反邏輯與可以應(yīng)用于任何類(lèi)型的操作數(shù)在有一個(gè)操作數(shù)不是布爾值的情況下,邏輯與操作就不一定返回布爾值屬于短 邏輯非(!) 可以應(yīng)用于ECMAScript中的任何值 無(wú)論這個(gè)值是什么數(shù)據(jù)類(lèi)型,這個(gè)操作符都會(huì)返回一個(gè)布爾值 邏輯非操作符首相會(huì)將它的操作數(shù)轉(zhuǎn)...
摘要:如果存在一個(gè)同名的全局變量,這個(gè)全局變量也不會(huì)被重寫(xiě),除非同名的局部變量被聲明時(shí)使用關(guān)鍵字。 博客原文地址:Claiyre的個(gè)人博客 https://claiyre.github.io/博客園地址:http://www.cnblogs.com/nuannuan7362/如需轉(zhuǎn)載,請(qǐng)?jiān)谖恼麻_(kāi)頭注明原文地址------------------------------------------...
摘要:走在前端的大道上持續(xù)更新,最后更新時(shí)間年月日從作用域說(shuō)開(kāi)去不再彷徨完全弄懂中的譯文總結(jié)你不知道的妙用深入理解之和中的對(duì)象拷貝高度自適應(yīng)的個(gè)方法中與區(qū)別中回調(diào)地獄的今生前世細(xì)談中的一些設(shè)計(jì)模式重溫核心概念和基本用法圖片預(yù)加載及插件編寫(xiě)實(shí)例跨域 走在前端的大道上 持續(xù)更新,最后更新時(shí)間2017年6月19日 從 JavaScript 作用域說(shuō)開(kāi)去 不再彷徨:完全弄懂JavaScript中的...
閱讀 3004·2023-04-25 21:23
閱讀 3049·2021-09-22 15:24
閱讀 874·2019-08-30 12:55
閱讀 2108·2019-08-29 18:42
閱讀 2616·2019-08-29 16:27
閱讀 958·2019-08-26 17:40
閱讀 2192·2019-08-26 13:29
閱讀 2620·2019-08-26 11:45