摘要:是模板方法,他封裝了子類中算法框架,它作為一個(gè)算法的模板,去指導(dǎo)子類以什么樣的順序去執(zhí)行代碼。制定算法骨架,讓子類具體實(shí)現(xiàn),這大概就是模板方法模式了吧
模板方法模式:
把相似的流程抽象出來作為一個(gè)父類,來封裝好子類的算法框架,然后子類繼承這個(gè)父類,并且可以重寫非公有的方法,來實(shí)現(xiàn)自己的業(yè)務(wù)邏輯。
聚個(gè)栗子
泡茶泡咖啡是很好的例子,不同企業(yè)的面試流程也是一個(gè)很好的例子
對(duì)于很多大型公司,比如BATTMD ,面試過程類似,先來簡(jiǎn)單假設(shè)一下面試過程:
筆試
技術(shù)面試
HR面試
等通知
那么假如不久的將來我就要去面試了,拿即將上市的小米來舉個(gè)例子(小白也有一個(gè)大廠夢(mèng)?。贘avaScript代碼中意淫一下小米的面試流程
首先,定義一個(gè)小米面試的構(gòu)造函數(shù)
var XiaomiInterview = function () {}
接下來,把面試的流程封裝成它的方法
1.筆試
XiaomiInterview.prototype.writtenTest=function(){ console.log("看到小米的筆試題,緊張,激動(dòng)~"); }
2.技術(shù)面
XiaomiInterview.prototype.technicalInterview=function(){ console.log("我是小米的前端技術(shù)負(fù)責(zé)人......"); }
3.HR面
XiaomiInterview.prototype.HRInterview = function (){ console.log("小米的HR小姐姐來面試我了,撲騰撲騰~"); }
4.等通知
XiaomiInterview.prototype.waitNotice=function(){ console.log("等得花兒都謝了,是不是涼涼了~"); }
現(xiàn)在代碼的基本結(jié)構(gòu)已經(jīng)有了,再來為它初始化一個(gè)方法
XiaomiInterview.prototype.init=function(){ this.writtenTest(); this.technicalInterview(); this.HRInterview(); this.waitNotice(); }
實(shí)現(xiàn)它
var xiaomiInterview = new XiaomiInterview(); xiaomiInterview.init();
小米面試的基本流程如上面的代碼,不管是BATTMD面試流程應(yīng)該都跟這個(gè)類似,只是步驟的內(nèi)容不一樣,就不一一枚舉了
那么不妨把流程抽象出來
接下來,就來改寫一下前面的代碼
首先定義一個(gè)類,就叫Interview
var Interview = function () {} //面試類
再抽象出方法
Interview.prototype.writtenTest=function(){ console.log("終于看到XX的筆試題了~"); } Interview.prototype.technicalInterview=function(){ console.log("你好,我是XX的前端技術(shù)負(fù)責(zé)人"); } Interview.prototype.HRInterview=function(){ console.log("XXHR來面試我了"); } Interview.prototype.waitNotice=function(){ console.log("到現(xiàn)在都不給我通知,是不是涼涼了~"); } Interview.prototype.init=function(){ this.writtenTest(); this.technicalInterview(); this.HRInterview(); this.waitNotice(); }
現(xiàn)在,創(chuàng)建一個(gè)XiaomiInterview子類來繼承父類的算法框架
var XiaomiInterview = function () {} XiaomiInterview.prototype = new Interview();
發(fā)現(xiàn)不管面哪一家,只有“等通知,涼涼”這一步是可以復(fù)用的T.T,所以我們需要重寫子類不能復(fù)用的方法
XiaomiInterview.prototype.writtenTest=function(){ console.log("看到小米的筆試題,緊張,激動(dòng)~"); } XiaomiInterview.prototype.technicalInterview=function(){ console.log("我是小米的前端技術(shù)負(fù)責(zé)人......"); } XiaomiInterview.prototype.HRInterview=function(){ console.log("小米的HR小姐姐來面試我了,撲騰撲騰~"); }
現(xiàn)在來實(shí)例化子類的對(duì)像
var xiaomiInterview = new XiaomiInterview(); xiaomiInterview.init();
抽象出來的模板類和子類已經(jīng)完成了,這里直接調(diào)用xiaomiInterview.init()方法,xiaomiInterview本身并沒有init()方法,但是它繼承了父類,會(huì)迎著原型鏈到父類中查找。
如果還想繼承其他子類,比如BAT面試類代碼也是一樣的。Interview.prototype.init() 是模板方法,他封裝了子類中算法框架,它作為一個(gè)算法的模板,去指導(dǎo)子類以什么樣的順序去執(zhí)行代碼。
回顧一下剛才的代碼,這是類式寫法,在JavaScript中,可以寫的更佳優(yōu)雅
接下來,用js風(fēng)格來表示上述的模板方法模式
創(chuàng)建Interview函數(shù)對(duì)象作為模板方法,它能接受一個(gè)JSON對(duì)象(傳入子類需要重寫的方法),創(chuàng)建一個(gè)F函數(shù)并給F函數(shù)添加init方法調(diào)用模板中的流程,最后返回F
var Interview = function (param) { var writtenTest = param.writtenTest || function() { throw new Error("必須傳writtenTest方法"); } var technicalInterview = param.technicalInterview || function() { throw new Error("必須傳technicalInterview方法"); } var HRInterview = param.HRInterview || function() { throw new Error("必須傳HRInterview方法"); } var waitNotice = function() { console.log("到現(xiàn)在都不給我通知,是不是涼涼了~"); } var F = function () {} F.prototype.init = function () { writtenTest(); technicalInterview(); HRInterview(); waitNotice(); } return F; }
重寫XiaomiInterview無法復(fù)用的方法并傳入到模板方法,來實(shí)現(xiàn)繼承
var XiaomiInterview = Interview({ writtenTest:function(){ console.log("看到小米的筆試題,緊張,激動(dòng)~"); }, technicalInterview:function(){ console.log("我是小米的前端技術(shù)負(fù)責(zé)人......"); }, HRInterview:function(){ console.log("小米的HR小姐姐來面試我了,撲騰撲騰~"); } });
最后一步,完成xiaomiInterview
var xiaomiInterview = new XiaomiInterview(); xiaomiInterview.init();
完整的js風(fēng)格代碼
var Interview = function (param) { var writtenTest = param.writtenTest || function() { throw new Error("必須傳writtenTest方法"); } var technicalInterview = param.technicalInterview || function() { throw new Error("必須傳technicalInterview方法"); } var HRInterview = param.HRInterview || function() { throw new Error("必須傳HRInterview方法"); } var waitNotice = function() { console.log("到現(xiàn)在都不給我通知,是不是涼涼了~"); } var F = function () {} F.prototype.init = function () { writtenTest(); technicalInterview(); HRInterview(); waitNotice(); } return F; } var XiaomiInterview = Interview({ writtenTest:function(){ console.log("看到小米的筆試題,緊張,激動(dòng)~"); }, technicalInterview:function(){ console.log("我是小米的前端技術(shù)負(fù)責(zé)人......"); }, HRInterview:function(){ console.log("小米的HR小姐姐來面試我了,撲騰撲騰~"); } }); var xiaomiInterview = new XiaomiInterview(); xiaomiInterview.init();
運(yùn)行一下,查看結(jié)果,順利完成了所有的流程
通過以上的實(shí)驗(yàn),漸漸明白了,“別找我們,我們找你”這一著名的好萊塢原則描述的反向控制結(jié)構(gòu)。子類放棄了對(duì)自己的控制權(quán),而是改為父類通知子類,作為子類,只負(fù)責(zé)提供一些設(shè)計(jì)上的細(xì)節(jié)。制定算法骨架,讓子類具體實(shí)現(xiàn),這大概就是模板方法模式了吧
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94711.html
摘要:組件化編碼的一切都是基于組件的。屬性返回目標(biāo)節(jié)點(diǎn)的前一個(gè)兄弟節(jié)點(diǎn)。如果目標(biāo)節(jié)點(diǎn)前面沒有同屬于一個(gè)父節(jié)點(diǎn)的節(jié)點(diǎn),將返回屬性是一個(gè)只讀屬性。而當(dāng)變量離開環(huán)境時(shí),則將其標(biāo)記為離開環(huán)境。 第一次寫面試經(jīng)歷,雖然之前有過一些電話面試經(jīng)歷,但相對(duì)而言感覺此次的經(jīng)歷對(duì)自己收獲還是比較大,這里留下面經(jīng)當(dāng)作日記吧?。嬖嚂r(shí)間:2018-6-12 下午2:10;時(shí)長(zhǎng):50min;公司:*) 1、說說Rea...
摘要:組件化編碼的一切都是基于組件的。屬性返回目標(biāo)節(jié)點(diǎn)的前一個(gè)兄弟節(jié)點(diǎn)。如果目標(biāo)節(jié)點(diǎn)前面沒有同屬于一個(gè)父節(jié)點(diǎn)的節(jié)點(diǎn),將返回屬性是一個(gè)只讀屬性。而當(dāng)變量離開環(huán)境時(shí),則將其標(biāo)記為離開環(huán)境。 第一次寫面試經(jīng)歷,雖然之前有過一些電話面試經(jīng)歷,但相對(duì)而言感覺此次的經(jīng)歷對(duì)自己收獲還是比較大,這里留下面經(jīng)當(dāng)作日記吧?。嬖嚂r(shí)間:2018-6-12 下午2:10;時(shí)長(zhǎng):50min;公司:*) 1、說說Rea...
摘要:的核心庫只關(guān)注視圖層,并且非常容易學(xué)習(xí),非常容易與其它庫或已有項(xiàng)目整合。的目標(biāo)是通過盡可能簡(jiǎn)單的實(shí)現(xiàn)響應(yīng)的數(shù)據(jù)綁定和組合的視圖組件。并不是框架,只是和他旁邊的生態(tài)環(huán)境組成了一個(gè)框架,下面,貼一個(gè)官方的漸進(jìn)式框架介紹圖吧,方便理解。 前言 本人學(xué)習(xí)了一段時(shí)間的vue,并嘗試寫了一些小Demo之后,將vue投入了幾個(gè)項(xiàng)目之后,一直在邊學(xué)習(xí)邊使用,經(jīng)過看了vue,vuex,vue-route...
摘要:的核心庫只關(guān)注視圖層,并且非常容易學(xué)習(xí),非常容易與其它庫或已有項(xiàng)目整合。的目標(biāo)是通過盡可能簡(jiǎn)單的實(shí)現(xiàn)響應(yīng)的數(shù)據(jù)綁定和組合的視圖組件。并不是框架,只是和他旁邊的生態(tài)環(huán)境組成了一個(gè)框架,下面,貼一個(gè)官方的漸進(jìn)式框架介紹圖吧,方便理解。 前言 本人學(xué)習(xí)了一段時(shí)間的vue,并嘗試寫了一些小Demo之后,將vue投入了幾個(gè)項(xiàng)目之后,一直在邊學(xué)習(xí)邊使用,經(jīng)過看了vue,vuex,vue-route...
閱讀 3079·2023-04-25 18:54
閱讀 2598·2021-11-02 14:40
閱讀 3193·2021-09-23 11:58
閱讀 2438·2019-08-30 13:50
閱讀 1243·2019-08-29 12:46
閱讀 3128·2019-08-28 17:51
閱讀 687·2019-08-26 11:47
閱讀 907·2019-08-23 16:17