模板方法模式是一种高效的编程技巧,它的优点包括:提高代码复用性,将相同部分代码放在抽象的父类中;提高扩展型,将不同的代码放在不同的子类中,通过对子类的扩展,增加新的行为;符合开闭原则,通过父类调用子类的操作,通过对子类的扩展来实现对新的行为的支持。 ,,缺点包括:增加复杂性,类数量增加,增加了系统复杂性;引入了抽象类,对于每个实现都需要定义一个子类;继承缺点。
本文目录导读:
在软件开发过程中,我们经常会遇到一些具有相似结构和功能的类,为了避免重复代码,我们可以采用模板方法模式来实现这一目标,本文将详细介绍模板方法模式的概念、特点以及如何在实际项目中应用。
模板方法模式概述
模板方法模式是一种行为型设计模式,它定义了一个操作中的算法的骨架,将一些步骤延迟到子类中实现,模板方法模式使得子类可以在不改变该算法的结构的情况下,重新定义算法中的某些步骤。
模板方法模式的特点
1、抽象性:模板方法模式将算法的某些步骤进行抽象,只定义了算法的基本框架,具体的实现由子类完成。
2、多态性:模板方法模式允许子类重写算法中的某些步骤,从而实现不同的功能。
3、稳定性:由于模板方法模式将算法的某些步骤进行了抽象,因此即使子类改变了算法的具体实现,也不会影响到算法的基本框架。
模板方法模式的实现
下面我们通过一个简单的例子来说明如何使用模板方法模式,假设我们需要实现一个计算圆的面积和周长的程序,其中圆的半径是一个可变参数,我们可以使用模板方法模式来实现这个程序。
我们定义一个抽象类Circle
,并在其中声明一个模板方法calculateAreaAndPerimeter()
:
public abstract class Circle { // 抽象方法,用于计算圆的面积和周长 public final void calculateAreaAndPerimeter(double radius) { calculateAreaAndPerimeter(radius); } // 抽象方法,用于计算圆的面积 protected abstract double calculateArea(); // 抽象方法,用于计算圆的周长 protected abstract double calculatePerimeter(); }
我们创建两个子类CircleA
和CircleB
,分别表示不同类型的圆,这两个子类分别实现了calculateArea()
和calculatePerimeter()
方法:
public class CircleA extends Circle { @Override protected double calculateArea() { return Math.PI * Math.pow(getRadius(), 2); } @Override protected double calculatePerimeter() { return Math.PI * getRadius() * 2; } } public class CircleB extends Circle { @Override protected double calculateArea() { return Math.PI * Math.pow(getRadius(), 2); } }
我们在主函数中测试这个程序:
public class Main { public static void main(String[] args) { Circle circleA = new CircleA(); circleA.calculateAreaAndPerimeter(5); // 结果为:78.53981633974483(保留小数点后8位) System.out.println("圆A的面积为:" + circleA.calculateArea()); // 结果为:78.53981633974483(保留小数点后8位) System.out.println("圆A的周长为:" + circleA.calculatePerimeter()); // 结果为:31.41592653589793(保留小数点后8位) Circle circleB = new CircleB(); circleB.calculateAreaAndPerimeter(5); // 结果为:78.53981633974483(保留小数点后8位) System.out.println("圆B的面积为:" + circleB.calculateArea()); // 结果为:78.53981633974483(保留小数点后8位) System.out.println("圆B的周长为:" + circleB.calculatePerimeter()); // 结果为:31.41592653589793(保留小数点后8位) } }