模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这种模式在很多场景下都有应用,例如创建复杂的对象、控制子类的扩展等。
模板方法模式是一种行为设计模式,它在一个抽象类中定义了一个算法的框架,将一些步骤的具体实现延迟到子类中,这种模式的主要优点是可以提高代码的复用性和可维护性,同时也提供了一种稳定的算法骨架,使得子类可以在不改变算法骨架的前提下,灵活地改变或扩展某些步骤的具体实现。
模板方法模式的主要角色有三个:抽象类、具体子类和抽象方法,抽象类定义了算法的骨架,包括一些抽象方法和一些具体方法,抽象方法是由子类来实现的,它们定义了算法中的一些关键步骤,具体方法是由抽象类自己来实现的,它们定义了一些固定的步骤,这些步骤对子类来说是透明的。
下面是一个使用模板方法模式的例子,假设我们要开发一个图形编辑器,它可以绘制各种图形,如圆形、矩形和三角形,我们可以使用模板方法模式来实现这个编辑器。
我们定义一个抽象类Shape
,它定义了一个算法的骨架,包括两个抽象方法和一个具体方法,抽象方法draw
和erase
由子类来实现,具体方法initialize
由抽象类自己来实现。
abstract class Shape { void initialize() { System.out.println("Initializing the shape"); } abstract void draw(); abstract void erase(); void finalize() { System.out.println("Finalizing the shape"); } }
我们定义三个具体子类Circle
、Rectangle
和Triangle
,它们分别实现了Shape
类的抽象方法。
class Circle extends Shape { @Override void draw() { System.out.println("Drawing a circle"); } @Override void erase() { System.out.println("Erasing a circle"); } } class Rectangle extends Shape { @Override void draw() { System.out.println("Drawing a rectangle"); } @Override void erase() { System.out.println("Erasing a rectangle"); } } class Triangle extends Shape { @Override void draw() { System.out.println("Drawing a triangle"); } @Override void erase() { System.out.println("Erasing a triangle"); } }
我们创建一个ShapeEditor
类,它使用Shape
对象来绘制和擦除图形。
class ShapeEditor { void draw(Shape shape) { shape.initialize(); shape.draw(); } void erase(Shape shape) { shape.erase(); } void run() { Shape circle = new Circle(); draw(circle); erase(circle); Shape rectangle = new Rectangle(); draw(rectangle); erase(rectangle); Shape triangle = new Triangle(); draw(triangle); erase(triangle); } }
当我们运行ShapeEditor
的run
方法时,它会创建三个不同的Shape
对象,并调用它们的draw
和erase
方法,从而绘制和擦除三个不同的图形,这就是模板方法模式的优点,它可以在不改变算法骨架的前提下,灵活地改变或扩展某些步骤的具体实现。