如何定义模板方法 Java

在软件开发中,模板方法模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。通过模板方法模式,可以在不改变算法结构的情况下,重定义算法的某些步骤。在本文中,我们将使用Java语言来演示如何定义模板方法,并解决一个具体的问题。

问题描述

假设我们有一个图形编辑器应用程序,其中有多种形状(例如圆形、正方形、三角形等),每种形状都可以绘制和填充。我们希望通过使用模板方法模式来实现这个图形编辑器。

解决方案

首先,我们定义一个抽象类 Shape,它包含一个模板方法 drawShape 和两个抽象方法 drawfill

public abstract class Shape {
    // 模板方法
    public final void drawShape() {
        draw();
        fill();
    }

    // 抽象方法
    abstract void draw();
    abstract void fill();
}

然后,我们创建具体的形状类,如 CircleRectangle,并实现抽象方法 drawfill

public class Circle extends Shape {
    @Override
    void draw() {
        System.out.println("Drawing Circle");
    }

    @Override
    void fill() {
        System.out.println("Filling Circle");
    }
}

public class Rectangle extends Shape {
    @Override
    void draw() {
        System.out.println("Drawing Rectangle");
    }

    @Override
    void fill() {
        System.out.println("Filling Rectangle");
    }
}

最后,我们在主程序中使用这些具体形状类来绘制和填充图形:

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle();
        circle.drawShape();

        Shape rectangle = new Rectangle();
        rectangle.drawShape();
    }
}

通过上述代码,我们成功定义了模板方法并解决了图形编辑器的问题。在运行主程序后,输出结果如下:

Drawing Circle
Filling Circle
Drawing Rectangle
Filling Rectangle

序列图

下面是一个描述模板方法模式的序列图:

sequenceDiagram
    participant Shape
    participant Circle
    participant Rectangle

    Shape ->> Circle: drawShape()
    Circle ->> Circle: draw()
    Circle ->> Circle: fill()

    Shape ->> Rectangle: drawShape()
    Rectangle ->> Rectangle: draw()
    Rectangle ->> Rectangle: fill()

关系图

下面是一个描述模板方法模式的关系图:

erDiagram
    Shape {
        abstract void draw()
        abstract void fill()
    }

    Circle {
        void draw()
        void fill()
    }

    Rectangle {
        void draw()
        void fill()
    }

通过以上示例,我们成功演示了如何定义模板方法并解决一个具体的问题。模板方法模式有助于提高代码复用性和可维护性,是一种常用的设计模式。希望本文对您有所帮助!