策略模式的定义是“定义一系列算法,把它们封装起来,并且使它们可以互换”。

策略模式也被称为政策模式(Policy)

优点:

  • 它提供了子类化的替代方案。
  • 它在每个类中定义了特定的行为,消除了条件语句的需要。
  • 它使得扩展和引入新行为变得更加容易,而无需更改应用程序。

使用场景:

  • 当多个类只有行为不同时,例如Servlet API。
  • 当你需要算法的不同变体时。

策略模式在核心Java API或JSE 7 API中的应用:

9-1.png

策略模式在高级Java API或JEE 7 API中的应用:

9-2.png

策略模式的UML:

9-3.png

策略模式的实现:

步骤 1:

创建一个Strategy接口。

// 这是一个接口
public interface Strategy { 
    public float calculation(float a, float b); 
}

步骤 2:

创建一个实现Strategy接口的Addition类。

// 这是一个类
public class Addition implements Strategy { 
    @Override 
    public float calculation(float a, float b) { 
        return a + b; 
    } 
}

步骤 3:

创建一个实现Strategy接口的Subtraction类。

// 这是一个类
public class Subtraction implements Strategy { 
    @Override 
    public float calculation(float a, float b) { 
        return a - b; 
    } 
}

步骤 4:

创建一个实现Strategy接口的Multiplication类。

// 这是一个类
public class Multiplication implements Strategy { 
    @Override 
    public float calculation(float a, float b) { 
        return a * b; 
    } 
}

步骤 5:

创建一个Context类,该类将请求Strategy接口来执行具体的策略。

// 这是一个类
public class Context { 
    private Strategy strategy; 
    
    public Context(Strategy strategy) { 
        this.strategy = strategy; 
    } 
    
    public float executeStrategy(float num1, float num2) { 
        return strategy.calculation(num1, num2); 
    } 
}

步骤 6:

创建一个StrategyPatternDemo类。

// 这是一个类
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class StrategyPatternDemo { 
    public static void main(String[] args) throws NumberFormatException, IOException { 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        System.out.print("Enter the first value: "); 
        float value1 = Float.parseFloat(br.readLine()); 
        System.out.print("Enter the second value: "); 
        float value2 = Float.parseFloat(br.readLine()); 

        Context context = new Context(new Addition());     
        System.out.println("Addition = " + context.executeStrategy(value1, value2)); 

        context = new Context(new Subtraction());    
        System.out.println("Subtraction = " + context.executeStrategy(value1, value2)); 

        context = new Context(new Multiplication());    
        System.out.println("Multiplication = " + context.executeStrategy(value1, value2)); 
    } 
}

输出:

当输入两个值时,程序会输出对应的加法、减法和乘法结果:

Enter the first value: 10
Enter the second value: 5
Addition = 15.0
Subtraction = 5.0
Multiplication = 50.0

标签: Design Patterns, Design Patterns教程, 设计模式, 软件设计, 结构型模式, 行为型模式, 单例模式, 工厂模式, 观察者模式, 中介者模式, 访问者模式