定義:定義一個算法框架,將一些實現的步驟延遲到子類中,在不改變算法的情況下,可從新定義算法的步驟。
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;具體情況,子類視情況具體實現。