从“能写判断”到“写好判断”:策略模式让 if-else 更优雅
2024-02-04 13:39:52
在软件开发中,我们经常需要编写代码来处理不同的情况。例如,我们可能需要根据用户的输入来决定显示不同的页面,或者根据数据的类型来决定使用不同的算法。传统上,我们会使用 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() 方法来计算面积。
策略模式是一种非常有用的设计模式。它可以使代码更易于理解、维护、重用和扩展。如果你在开发中遇到需要处理不同情况的情况,那么你应该考虑使用策略模式。