JavaScript设计模式之模板方法模式
简介
模板方法模式(Template Method Design Pattern)又称为模板模式,是一种行为型设计模式。在该模式中,定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现。也就是说,在父类中定义好算法的骨架,具体实现留给子类去实现,这样就可以保证算法的整体流程在父类中控制,所有子类遵循相同的规则去按照父类中定义好的流程去运行自身的方法。这种类型的设计模式属于行为型模式。
模式原理
模板方法模式主要由抽象模板类抽象方法和实现方法组成。
抽象模板类抽象方法定义了算法步骤的框架,包括接口和实现方法。在接口中,父类只做声明而不进行具体实现,并在实现类中必须予以实现。而在实现类继承了抽象类后,只需要补充完具体的实现(也就是覆盖模板方法中的某些抽象方法),程序即能运行。这种机制也称为“钩子”机制。
具体模板类实现抽象方法,完成算法步骤的具体实现。
用法示例
下面通过一个简单的示例来说明模板方法的用法。
- 假设定义了一个网站开发的模板类Website。这个类中包含一个操作的模板方法createWebsite(),用于创建一个网站。
class Website {
constructor() {
this.templateMethod()
}
templateMethod() {
this.createDesign()
this.createContent()
this.createPublish()
}
createDesign() {
throw new Error("The method createDesign must be implemented.");
}
createContent() {
throw new Error("The method createContent must be implemented.");
}
createPublish() {
throw new Error("The method createPublish must be implemented.");
}
}
这个抽象类中,createDesign()、createContent()和createPublish()是钩子方法,需要在子类中进行实现,否则将会抛出错误。
- 假设现在需要创建一个博客网站和一个商业网站,它们都属于上述Website类,但不同的是,博客网站需要优先考虑内容的创建,而商业网站需要优先考虑设计。因此需要创建两个针对于不同网站的实例化子类,分别是BlogSite类和BusinessSite类。
class BlogSite extends Website {
createDesign() {
console.log("Blog site design created.");
}
createContent() {
console.log("Blog site content created.");
}
createPublish() {
console.log("Blog site published.");
}
}
class BusinessSite extends Website {
createDesign() {
console.log("Business site design created.");
}
createContent() {
console.log("Business site content created.");
}
createPublish() {
console.log("Business site published.");
}
}
在这里,我们为BlogSite类和BusinessSite类都重写了模板类中的三个钩子方法,并提供了各自的实现。
- 最后,创建BlogSite和BusinessSite的实例,并调用它们的createWebsite()方法来创建一个网站。运行代码后,能够看到两个针对不同网站的不同处理过程被顺利地执行了。
const blog = new BlogSite();
blog.createWebsite();
// 日志网站设计创建完成。
// 日志网站内容创建完成。
// 日志网站发布完成。
const business = new BusinessSite();
business.createWebsite();
// 商业网站设计创建完成。
// 商业网站内容创建完成。
// 商业网站发布完成。
在这段代码中,BlogSite和BusinessSite都被实例化了,然后调用了相应的createWebsite()方法,插槽式的模板方法将会根据实例的不同而执行不同的钩子方法。
总结
模板方法模式是一种非常优秀的设计模式,可以用来实现一个算法的骨架,让具体实现交由子类来完成。这样子就可以保证算法的整体流程在父类中控制,但子类又不失灵活性,可以根据自己的需要去完成不同的实现。
在实际的开发中,模板方法模式也可以应用在很多场景,比如在框架设计、搭建上线流程、游戏设计等方面。但在使用时要注意抽象类的设计与实现,确保模板类中的方法能够通过子类的实现达到预期的效果,避免在使用中遇到不必要的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript设计模式之模板方法模式原理与用法示例 - Python技术站