10模板方法模式--javascript

定義:定義一個算法框架,將一些實現的步驟延遲到子類中,在不改變算法的情況下,可從新定義算法的步驟。

IGame.js

export default class IGame{
    constructor(){

    }
    login(){this.Overriding()};
    stop(){this.Overriding()};
    play(){this.Overriding()};

    star(){
        this.login();
        this.play();
        this.stop();
    };
    Overriding(){throw Error("IGame需要實現")}
}

 star()方法寫在IGame中:如果star()寫在每個子類中,方法中的代碼一樣,也是必須一樣的,因爲這是一個固定的操作邏輯。

                                         如果不一樣了,則會發生錯誤,不可控。

                                         如果一樣了,這段代碼邏輯發生改變(修復bug),則全部子類中都要修改,不利於修改。

 

DotaGame.js

import IGame from './IGame'
export default class DotaGame extends IGame{
    constructor(){
        super();
    }
    login(){console.log("dota login")};
    stop(){console.log("dota stop")};
    play(){console.log("dota play")};
}

LOLGame.js

import IGame from './IGame'
export default class LOLGame extends IGame{
    constructor(){
        super();
    }
    login(){this.loginWeGame();console.log("LOL login");};
    loginWeGame(){console.log("wegame login")}

    stop(){console.log("LOL stop");this.stopWeGame()};
    stopWeGame(){console.log("wegame stop")}
    play(){console.log("LOL play")};
}

client.js

import DotaGame from './DotaGame.js'
import LOLGame from './LOLGame.js'

console.log(DotaGame);
let dota = new DotaGame();
dota.star();

let lol = new LOLGame();
lol.star();

結果:

對於高層的client模塊而言,他只需要知道模板方法star。

IGame只需知道login、stop、play;具體情況,子類視情況具體實現。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章