设计模式 - 浅谈模板模式
模板模式
模式功能说明:它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。
模式思路与原理
模板模式通俗的描述是完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。每个步骤的具体实现,由子类完成。
代码示例
abstract class WebsiteTemplate {
public void buildWebsite() {
createHeader();
createContent();
createFooter();
}
public abstract void createHeader();
public abstract void createContent();
public abstract void createFooter();
}
class NewsWebsite extends WebsiteTemplate {
public void createHeader() {
System.out.println("Creating News Header");
}
public void createContent() {
System.out.println("Creating News Content");
}
public void createFooter() {
System.out.println("Creating News Footer");
}
}
class BlogWebsite extends WebsiteTemplate {
public void createHeader() {
System.out.println("Creating Blog Header");
}
public void createContent() {
System.out.println("Creating Blog Content");
}
public void createFooter() {
System.out.println("Creating Blog Footer");
}
}
WebsiteTemplate
是一个抽象类,定义了一个算法的骨架,buildWebsite
方法就是一个模板方法。NewsWebsite
和BlogWebsite
是两个具体的实现,它们重写了WebsiteTemplate
中的方法,但是算法的结构还是由WebsiteTemplate
中的buildWebsite
方法来决定的。
使用场景:
- 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
优缺点
优点:
- 可以实现代码复用,避免代码冗余。
- 子类可以有更多的扩展性,可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
缺点:
- 模板方法会带来代码阅读的困难,会让用户对一个算法的实现细节产生困惑。
总结
模板模式使用了设计原则有:"依赖倒置原则",即高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。 模板模式它提供了一种重用和定制代码的强大方式,但是也需要注意,过度使用可能会导致代码难以理解和维护。