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;具体情况,子类视情况具体实现。

 

 

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