策略模式和工厂模式都是设计模式中的一种,但是它们的关注点不同。工厂模式关注的是对象的创建过程,而策略模式关注的是行为的封装。
在计算机科学和软件开发中,设计模式是一种被广泛接受和应用的解决特定问题的通用解决方案,这些模式提供了一种可重用的、经过验证的方法来解决常见问题,从而提高了代码的可读性、可维护性和可扩展性,本文将重点介绍策略模式这一设计模式。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立的类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它的客户端。
策略模式的主要目的是实现一个可配置的算法,让客户端可以在运行时根据需要选择不同的算法,这种模式通常用于需要在运行时动态选择不同行为的场景,例如排序算法、计算器等。
策略模式的核心组件包括:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(Concrete Strategy):实现抽象策略的具体类,每个具体策略类实现了一个特定的算法。
3、上下文(Context):持有一个策略对象的引用,提供给客户端调用其方法。
下面我们通过一个简单的例子来说明策略模式的用法,假设我们需要实现一个简单的计算器,它可以根据用户输入的运算符执行加法、减法、乘法和除法运算。
我们定义一个抽象策略类Operation
,它包含了所有支持的运算符的公共接口:
public interface Operation { int execute(int a, int b); }
我们为每种运算符实现一个具体的策略类:
public class AddOperation implements Operation { @Override public int execute(int a, int b) { return a + b; } } public class SubtractOperation implements Operation { @Override public int execute(int a, int b) { return a - b; } } public class MultiplyOperation implements Operation { @Override public int execute(int a, int b) { return a * b; } } public class DivideOperation implements Operation { @Override public int execute(int a, int b) { return a / b; } }
我们定义一个上下文类CalculatorContext
,它持有一个策略对象的引用,并提供给客户端调用其方法:
public class CalculatorContext { private Operation operation; public CalculatorContext(Operation operation) { this.operation = operation; } public int executeOperation(int a, int b) { return operation.execute(a, b); } }
客户端可以根据需要创建不同的策略对象,并将其传递给上下文对象:
public class Main { public static void main(String[] args) { // 根据需要选择不同的策略对象进行计算 CalculatorContext addContext = new CalculatorContext(new AddOperation()); System.out.println("10 + 5 = " + addContext.executeOperation(10, 5)); // 输出:10 + 5 = 15 CalculatorContext subtractContext = new CalculatorContext(new SubtractOperation()); System.out.println("10 - 5 = " + subtractContext.executeOperation(10, 5)); // 输出:10 - 5 = 5 } }
通过使用策略模式,我们可以在不修改客户端代码的情况下,轻松地添加新的运算符和调整现有的运算符,这使得我们的计算器更加灵活和可扩展。