JavaScript狀態(tài)模式及適配器模式使用講解
一、狀態(tài)模式
允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為,對象看起來似乎修改了它的類
1.基本實現(xiàn)
//下面以一個開燈程序演示狀態(tài)模式 //燈共用三種狀態(tài),分別是‘關(guān)閉',‘弱光‘和'強光‘。每次按下開關(guān)按鈕都會換擋。 let OfflightState = function (light) { this.light = light; } OfflightState.prototype.buttonPressed = function () { console.light('弱光'); this.light.setState(this.light.weakLightState); } let WeakLightState = function (light) { this.light = light; } WeakLightState.prototype.buttonPressed = function () { console.log('強光') this.light.setState(this.light.strongLightState); } let StrongLightState = function (light) { this.light = light; } StrongLightState.prototype.buttonPressed = function () { console.log('關(guān)閉'); this.light.setState(this.light.offlightState) } let Light = function () { this.offlightState = new OfflightState(this); this.weakLightState = new WeakLightState(this); this.strongLightState = new StrongLightState(this); this.button = null; } Light.prototype.init = function () { let button = document.createElement('button'); self = this; this.button = document.body.appendChild(button); this.button.innerHTML = '開關(guān)'; this.button.currState = this.offlightState; this.button.onclick = function () { self.currState.buttonPressed; } } Light.prototype.setState = function (newState) { this.currState = newState; } let light = new Light(); light.init();
以上代碼實現(xiàn)了一個基本的狀態(tài)模式,狀態(tài)的切換規(guī)律事先被定義好在各個狀態(tài)類中,主體上無需關(guān)心切換的細(xì)節(jié)。如果日后又新增了一個狀態(tài),那我們只要編寫好新的狀態(tài)類,加入到原有代碼中就可以了。
2.狀態(tài)模式的優(yōu)缺點
(1)狀態(tài)模式定義了狀態(tài)與行為之間的關(guān)系,并將它們封裝在一個類里。通過增加新的狀態(tài)類,很容易增加新的狀態(tài)和轉(zhuǎn)換
(2)避免Context無限膨脹,狀態(tài)切換的邏輯被分布在狀態(tài)類中,也去掉了Context中原本過多的分支。
(3)用對象代替字符串來記錄當(dāng)前狀態(tài),使得狀態(tài)的切換更加一目了然。
(4)Context中的請求動作和狀態(tài)類中封裝的行為可以非常容易地獨立變化而互不影響。
3.狀態(tài)模式中的性能優(yōu)化點
(1)狀態(tài)可以等待需要的時候再創(chuàng)建,也可以一開始就創(chuàng)建好,具體依據(jù)實際場景、
(2)state對象可以在多個類之間共享。
二、適配器模式
解決兩個軟件實體間接口不兼容問題
適配器模式的應(yīng)用
let googleMap = { show: function () { console.log('開始渲染谷歌地圖'); } } let baiduMap = { show: function () { console.log('開始渲染百度地圖'); } } let renderMap = function (map) { map.show(); } /** * 以上代碼段實現(xiàn)了渲染不同地圖的功能?,F(xiàn)在假設(shè)BaiduMap的api改成了display,修改源代碼勢必不太符合開閉原則,這時候我們可以通過新建一個適配器來達(dá)到目的 */ let baiduMapAdapter = { show: function () { return baiduMap.display(); } } renderMap(baiduMapAdapter);
到此這篇關(guān)于JavaScript狀態(tài)模式及適配器模式使用講解的文章就介紹到這了,更多相關(guān)JavaScript狀態(tài)模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
highcharts.js數(shù)據(jù)綁定方式代碼實例
這篇文章主要介紹了highcharts.js數(shù)據(jù)綁定方式代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11JavaScript 函數(shù)用法詳解【函數(shù)定義、參數(shù)、綁定、作用域、閉包等】
這篇文章主要介紹了JavaScript 函數(shù)用法,結(jié)合實例形式分析了JavaScript函數(shù)定義、參數(shù)、綁定、作用域、閉包、回調(diào)函數(shù)、柯理化函數(shù)等相關(guān)概念、原理與操作注意事項,需要的朋友可以參考下2020-05-05countup.js實現(xiàn)數(shù)字動態(tài)疊加效果
這篇文章主要為大家詳細(xì)介紹了countup.js實現(xiàn)數(shù)字動態(tài)疊加效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10json數(shù)據(jù)與字符串的相互轉(zhuǎn)化示例
json與字符串之間的轉(zhuǎn)換,在使用中經(jīng)常會遇到,本文有個不錯的示例,大家可以參考下,或許會有所幫助2013-09-09利用JS對iframe父子(內(nèi)外)頁面進(jìn)行操作的方法教程
這篇文章主要給大家介紹了利用JS對iframe父子(內(nèi)外)頁面進(jìn)行操作的方法教程,其中包括了怎么對iframe進(jìn)行操作、在iframe里面控制iframe外面的js代碼以及在父框架對子iframe進(jìn)行操作等,需要的朋友可以參考借鑒。2017-06-06Smartour 讓網(wǎng)頁導(dǎo)覽變得更簡單(推薦)
這篇文章主要介紹了Smartour 讓網(wǎng)頁導(dǎo)覽變得更簡單(推薦),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07