模板方法模式是一种行为型设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 ,,模板方法模式的优点有:,- 可以让子类扩展或具体实现固定方法的某个具体的步骤。,- 对于模板来说,是一套固定的算法,通过子类可以扩展固定算法中某些算法步骤。,- 可以使子类在不改变算法结构的前提下,重新定义算法的某些步骤。,,缺点有:,- 如果子类没有重写某些步骤,则会使用模板方法中的默认实现。,- 如果子类中有多个重写步骤,则需要考虑如何处理这些步骤之间的关系。
在软件开发过程中,我们经常会遇到一些通用的功能和算法,这些功能和算法在多个类中都有相似的实现,为了避免代码重复,提高代码的可维护性和可扩展性,我们可以将这些通用功能和算法抽象成一个模板类,然后让其他类继承这个模板类,实现具体的功能,这就是模板方法模式。
模板方法模式定义如下:
1、抽象类(AbstractClass):定义一个模板方法,该方法包含一个或多个步骤,每个步骤都是抽象的;定义一个或多个抽象方法,这些方法在各个子类中实现。
2、具体类(ConcreteClassA、ConcreteClassB):继承抽象类,实现抽象方法。
下面我们通过一个简单的例子来说明模板方法模式的使用。
假设我们需要开发一个图书管理系统,系统中有一个功能是计算图书的价格,我们希望所有图书的价格计算方式都遵循一定的规则,基本价格+作者*版税,为了实现这个功能,我们可以采用模板方法模式。
我们定义一个抽象类Book
,其中包含一个模板方法calculatePrice()
,以及一个抽象方法getAuthor()
。
public abstract class Book { // 计算价格的模板方法 public final double calculatePrice() { // 基本价格 double basePrice = 50; // 作者版税 double authorTax = getAuthor().getTax(); // 计算总价格 return basePrice + authorTax; } // 获取作者信息的方法,具体实现由子类完成 protected abstract Author getAuthor(); }
我们定义两个具体的类BookA
和BookB
,它们分别继承自Book
类,并实现getAuthor()
方法。
public class BookA extends Book { private Author author; public BookA(Author author) { this.author = author; } @Override protected Author getAuthor() { return author; } } public class BookB extends Book { private Author author; public BookB(Author author) { this.author = author; } @Override protected Author getAuthor() { return author; } }
我们可以创建两个具体的作者对象,并分别创建对应的书籍对象,然后调用calculatePrice()
方法计算书籍的价格。
public class Main { public static void main(String[] args) { Author authorA = new Author("张三", 0.1); Book bookA = new BookA(authorA); System.out.println("书籍A的价格:" + bookA.calculatePrice()); Author authorB = new Author("李四", 0.2); Book bookB = new BookB(authorB); System.out.println("书籍B的价格:" + bookB.calculatePrice()); } }
通过以上示例,我们可以看到模板方法模式的优点:它将复杂的计算过程抽象成了一个模板方法,使得子类只需要关注具体的实现细节;模板方法模式也保证了系统的可扩展性,当需要添加新的图书类型时,只需要增加一个新的子类即可。