Java策略模式

策略模式是一种行为型设计模式,它允许在运行时动态地改变对象的行为。在Java中,策略模式通常由一个接口和多个实现该接口的类组成。

 

下面是一个简单的例子,假设有一个计算器类,它可以执行加、减、乘、除四种操作。我们可以使用策略模式来实现这个计算器类,使得它可以在运行时动态地改变操作。

 

首先,我们定义一个接口`Operation`,它包含一个`calculate`方法,用于执行具体的操作:

public interface Operation {

    double calculate(double num1, double num2);

}

 

然后,我们实现四个具体的操作类,分别是加、减、乘、除:

public class AddOperation implements Operation {

    @Override

    public double calculate(double num1, double num2) {

        return num1 + num2;

    }

}

 

public class SubOperation implements Operation {

    @Override

    public double calculate(double num1, double num2) {

        return num1 - num2;

    }

}

 

public class MulOperation implements Operation {

    @Override

    public double calculate(double num1, double num2) {

        return num1 * num2;

    }

}

 

public class DivOperation implements Operation {

    @Override

    public double calculate(double num1, double num2) {

        if (num2 == 0) {

            throw new IllegalArgumentException("除数不能为0");

        }

        return num1 / num2;

    }

}

 

最后,我们定义一个计算器类`Calculator`,它包含一个`operation`成员变量,用于保存当前的操作。`Calculator`类还包含一个`setOperation`方法,用于设置当前的操作,以及一个`calculate`方法,用于执行计算:

public class Calculator {

    private Operation operation;

 

    public void setOperation(Operation operation) {

        this.operation = operation;

    }

 

    public double calculate(double num1, double num2) {

        if (operation == null) {

            throw new IllegalStateException("操作未设置");

        }

        return operation.calculate(num1, num2);

    }

}

 

现在,我们可以使用策略模式来创建一个计算器对象,并动态地改变操作:

Calculator calculator = new Calculator();

calculator.setOperation(new AddOperation());

double result = calculator.calculate(1, 2); // 3.0

 

calculator.setOperation(new SubOperation());

result = calculator.calculate(3, 2); // 1.0

 

calculator.setOperation(new MulOperation());

result = calculator.calculate(2, 3); // 6.0

 

calculator.setOperation(new DivOperation());

result = calculator.calculate(6, 3); // 2.0

 

通过使用策略模式,我们可以在运行时动态地改变计算器的操作,而不需要修改计算器类的代码。这样,我们可以更加灵活地使用计算器类,同时也更容易扩展和维护。