返回

从“能写判断”到“写好判断”:策略模式让 if-else 更优雅

前端

在软件开发中,我们经常需要编写代码来处理不同的情况。例如,我们可能需要根据用户的输入来决定显示不同的页面,或者根据数据的类型来决定使用不同的算法。传统上,我们会使用 if-else 语句来实现这些判断。然而,随着代码的不断增加,if-else 语句也会变得越来越复杂和难以维护。

策略模式提供了一种更优雅的方式来处理不同的情况。它允许你将判断逻辑从代码中分离出来,并将其封装成独立的类。这样,你就可以根据需要在不同的类之间进行切换,而无需修改现有代码。

策略模式的优点有很多。首先,它可以使代码更易于理解和维护。其次,它可以提高代码的可重用性。第三,它可以使代码更易于扩展。

下面是一个使用策略模式的例子。我们假设我们要编写一个程序来计算不同形状的面积。我们可以定义一个 Shape 类,它包含一个计算面积的方法。然后,我们可以定义不同的子类来表示不同的形状,例如 Circle、Rectangle 和 Triangle。每个子类都实现了计算面积的方法,并根据自己的形状来计算面积。

public abstract class Shape {
    public abstract double calculateArea();
}

public class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }
}

public class Rectangle extends Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double calculateArea() {
        return width * height;
    }
}

public class Triangle extends Shape {
    private double base;
    private double height;

    public Triangle(double base, double height) {
        this.base = base;
        this.height = height;
    }

    @Override
    public double calculateArea() {
        return 0.5 * base * height;
    }
}

public class AreaCalculator {
    private Shape shape;

    public AreaCalculator(Shape shape) {
        this.shape = shape;
    }

    public double calculateArea() {
        return shape.calculateArea();
    }
}

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle(5);
        AreaCalculator circleCalculator = new AreaCalculator(circle);
        double circleArea = circleCalculator.calculateArea();

        Shape rectangle = new Rectangle(10, 5);
        AreaCalculator rectangleCalculator = new AreaCalculator(rectangle);
        double rectangleArea = rectangleCalculator.calculateArea();

        Shape triangle = new Triangle(10, 5);
        AreaCalculator triangleCalculator = new AreaCalculator(triangle);
        double triangleArea = triangleCalculator.calculateArea();

        System.out.println("Circle area: " + circleArea);
        System.out.println("Rectangle area: " + rectangleArea);
        System.out.println("Triangle area: " + triangleArea);
    }
}

在这个例子中,Shape 类是抽象类,它定义了一个计算面积的方法。Circle、Rectangle 和 Triangle 类都是 Shape 类的子类,它们实现了计算面积的方法,并根据自己的形状来计算面积。AreaCalculator 类使用策略模式来计算不同形状的面积。它有一个 Shape 属性,它存储着要计算面积的形状。AreaCalculator 类有一个 calculateArea() 方法,它调用 Shape 属性的 calculateArea() 方法来计算面积。

策略模式是一种非常有用的设计模式。它可以使代码更易于理解、维护、重用和扩展。如果你在开发中遇到需要处理不同情况的情况,那么你应该考虑使用策略模式。