在计算机科学中,设计模式是一种被广泛接受并用于解决特定问题的优秀解决方案,它们提供了一种可重用的、经过验证的解决方案,可以帮助开发者在面对复杂问题时,能够更快地找到合适的解决方案,本文将详细介绍一种设计模式——模板方法模式。
模板方法模式是一种行为型设计模式,它在父类中定义了一个算法的骨架,将一些步骤延迟到子类中实现,这种模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法模式的主要角色有以下几个:
1、抽象类(Template):这是模板方法模式的父类,定义了算法的骨架和一些抽象方法,抽象方法是那些只有接口或超类中声明的方法,具体的实现则由子类完成。
2、具体类(Concrete):这是模板方法模式的子类,实现了抽象类中的抽象方法,并可以添加自己的具体实现。
3、客户端(Client):这是使用模板方法模式的类,它通过调用抽象类的方法来使用算法,而不需要关心算法的具体实现。
下面我们通过一个简单的例子来说明模板方法模式的使用,假设我们要实现一个计算圆的面积和周长的功能,我们可以使用模板方法模式来实现这个功能。
我们定义一个抽象类Circle
,它包含一个抽象方法calculateArea()
和一个抽象方法calculatePerimeter()
。calculateArea()
方法的实现由子类完成,calculatePerimeter()
方法的实现也由子类完成。
public abstract class Circle { // 计算圆的面积 public abstract double calculateArea(); // 计算圆的周长 public abstract double calculatePerimeter(); }
我们定义两个具体的子类CIRCLE_A
和CIRCLE_B
,分别表示半径为a和b的圆,这两个子类分别实现了calculateArea()
和calculatePerimeter()
方法。
public class CIRCLE_A extends Circle { private double radius; public CIRCLE_A(double radius) { this.radius = radius; } @Override public double calculateArea() { return Math.PI * radius * radius; } @Override public double calculatePerimeter() { return 2 * Math.PI * radius; } } public class CIRCLE_B extends Circle { private double radius; public CIRCLE_B(double radius) { this.radius = radius; } @Override public double calculateArea() { return Math.PI * radius * radius; } @Override public double calculatePerimeter() { return 2 * Math.PI * radius; } }
我们定义一个客户端类CircleTest
,它通过调用Circle
接口的方法来使用模板方法模式,这样,当我们需要修改算法时,只需要修改相应的子类即可,而不需要修改客户端代码。
public class CircleTest { public static void main(String[] args) { Circle circleA = new CIRCLE_A(5); System.out.println("圆A的面积为:" + circleA.calculateArea()); System.out.println("圆A的周长为:" + circleA.calculatePerimeter()); System.out.println("圆B的面积为:" + new CIRCLE_B(7).calculateArea()); System.out.println("圆B的周长为:" + new CIRCLE_B(7).calculatePerimeter()); } }