成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript設(shè)計(jì)模式學(xué)習(xí)日記--模板方法模式

jsdt / 2572人閱讀

摘要:是模板方法,他封裝了子類中算法框架,它作為一個(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

相關(guān)文章

  • 我的前端面試日記(一)

    摘要:組件化編碼的一切都是基于組件的。屬性返回目標(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...

    warkiz 評(píng)論0 收藏0
  • 我的前端面試日記(一)

    摘要:組件化編碼的一切都是基于組件的。屬性返回目標(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...

    zhunjiee 評(píng)論0 收藏0
  • Vue學(xué)習(xí)日記(一)——Vue介紹

    摘要:的核心庫只關(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...

    王晗 評(píng)論0 收藏0
  • Vue學(xué)習(xí)日記(一)——Vue介紹

    摘要:的核心庫只關(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...

    MasonEast 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<