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