模板方法模式:模板方法是封装算法流程,对某些细节,提供接口由子类修改,建造者模式更为高层一点,将所有细节都交由子类实现
将基层的类算法框架搭起来,具体通过子类进行实现,例如学生日常的行为吃喝拉撒作为一个框架,具体的内容,怎么吃怎么喝交由子类处理
class Student{
daily(){
this.startUp();
this.eatFood();
this.study();
this.sleep();
}
startUp(){
throw Error("必须实例化老子!")
}
eatFood(){
throw Error("必须实例化老子!")
}
study(){
throw Error("必须实例化老子!")
}
sleep(){
throw Error("必须实例化老子!")
}
}
具体的自律的学生,实现吃喝拉撒:
class 自律的学生 extends Student{
constructor(){
super()
}
startUp(){
console.log("六点起床")
}
eatFood(){
console.log("六点半吃饭")
}
study(){
console.log("七点学习")
}
sleep(){
console.log("十点睡觉")
}
}
放纵的学生实现:
class 放纵的学生 extends Student{
constructor(){
super()
}
startUp(){
console.log("九点起床")
}
eatFood(){
console.log("九点半同学带饭")
}
study(){
console.log("从不学习")
}
sleep(){
console.log("凌晨一点睡觉")
}
}
调用继承来的daily方法:
const sunzehui = new 自律的学生()
sunzehui.daily()
console.log('-------------')
const mouren = new 放纵的学生()
mouren.daily()
/*
output:
六点起床
六点半吃饭
七点学习
十点睡觉
-------------
九点起床
九点半同学带饭
从不学习
凌晨一点睡觉
*/
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
**缺点:**每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。
参考资料: