策略模式(Strategy Pattern)

简介: 一、策略模式在策略(Strategy Pattern)中,一个类的行为或算法可以在运行时动态的更改。这种类型的设计模式属于行为模式(Behavioral Pattern-对象间通信)。

一、策略模式

在策略(Strategy Pattern)中,一个类的行为或算法可以在运行时动态的更改。这种类型的设计模式属于行为模式(Behavioral Pattern-对象间通信)。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。

二、介绍

意图: 定义一系列算法,把它们一个个封装起来,并且是她们可互相替换。

Define a family of algorithms, encapsulate each one, and make them interchangeable

主要解决: 在有多种算法相似的情况下,使用if...else 所带来的复杂和难以维护。
何时使用: 一个系统中有许多许多类,而区分它们的只是它们直接的行为。
如何解决: 将这些算法封装成一个一个类,任意替换。
关键代码: 实现同一个接口。
应用实例:

  1. 诸葛亮的锦囊妙计,每个锦囊就是一个策略。
  2. 旅行的出游方式,选择,️,,,,每一种旅行方式都是一个策略。
  3. Java AWT 中的LayoutManager。(这个不熟悉)

优点:

  1. 算法可以自由的切换。
  2. 避免使用多重条件判断。
  3. 扩展性良好。

缺点:

  1. 策略类会增多。
  2. 所有的策略类都需要对外暴露。
    使用场景:
  3. 如果在一个系统中有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
  4. 一个系统需要动态地在几种算法中选择一种。
  5. 如果一个对象有许多行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

注意事项: 如果一个系统中的策略多于4个,就是需要考虑使用混合模式,解决策略模式膨胀的问题。

三、实现

类结构图如下:

1240
策略模式类图.png
  • Context角色:起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
  • Strategy抽象策略角色:策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
  • ConcreteStrategy具体策略角色:实现抽象策略中的操作,该类含有具体的算法。
  1. 创建策略接口(Strategy):
    public interface Strategy {
     int doOperation(int operator1, int operator2);
    }
  2. 创建策略具体算法实现类(OperationAdd、OperationMultiply、OperationSubstract):
    public class OperationAdd implements Strategy {
     @Override
     public int doOperation(int operator1, int operator2) {
         return operator1 + operator2;
     }
    }
  3. 创建Context类:

    public class Context {
     private Strategy strategy;
    
     public Context(Strategy strategy) {
         this.strategy = strategy;
     }
    
     public int executeStrategy(int operator1, int operator2) {
         return strategy.doOperation(operator1, operator2);
     }
    
     public void setStrategy(Strategy strategy) {
         this.strategy = strategy;
     }
    }
  4. 使用 Context 来查看当它改变策略 Strategy 时的行为变化。

    public class Test {
     public static void main(String[] args) {
         int operator1 = 10;
         int operator2 = 2;
         int result = 0;
    
         Context ctx = new Context(new OperationAdd());
         result = ctx.executeStrategy(operator1, operator2);
         System.out.println(operator1 + " + " + operator2 + " = " + result);
    
         ctx.setStrategy(new OperationMultiply());
         result = ctx.executeStrategy(operator1, operator2);
         System.out.println(operator1 + " * " + operator2 + " = " + result);
    
         ctx.setStrategy(new OperationSubstract());
         result = ctx.executeStrategy(operator1, operator2);
         System.out.println(operator1 + " - " + operator2 + " = " + result);
    
     }
    }
  5. 结果

    1240
    输出结果.png
目录
相关文章
|
4月前
|
算法 搜索推荐 Java
策略模式 Strategy
策略模式 Strategy
64 0
|
4月前
|
设计模式 算法 Java
行为型设计模式-策略模式(Strategy Pattern)
行为型设计模式-策略模式(Strategy Pattern)
|
11月前
|
设计模式 算法 关系型数据库
设计模式1 - 策略模式【Strategy Pattern】
设计模式1 - 策略模式【Strategy Pattern】
38 0
|
算法 Java
行为型模式 - 策略模式(Strategy Pattern)
行为型模式 - 策略模式(Strategy Pattern)
|
设计模式 Java Spring
Java设计模式教程-策略模式(Strategy Pattern)(下)
Java设计模式教程-策略模式(Strategy Pattern)(下)
136 0
Java设计模式教程-策略模式(Strategy Pattern)(下)
|
设计模式 算法 Java
Java设计模式教程-策略模式(Strategy Pattern)(上)
Java设计模式教程-策略模式(Strategy Pattern)(上)
120 0
Java设计模式教程-策略模式(Strategy Pattern)(上)
|
设计模式 安全 Java
设计模式|从Visitor Pattern说到Pattern Matching
在软件开发领域,我们每次遇到的问题可能都各不相同,有些是跟电商业务相关的,有些是跟底层数据结构相关的,而有些则可能重点在性能优化上。然而不管怎么样,我们在代码层面上解决问题的方法都有一定的共性。有没有人总结过这些共性呢?
设计模式|从Visitor Pattern说到Pattern Matching
|
算法 Java
设计模式实战-策略模式(Strategy Pattern)
0.0 相关源码链接 https://github.com/Wasabi1234/design-patterns 1 定义 也叫做政策模式(Policy Pattern) 维基百科对象有某个行为,但是在不同的场景中,该行为有不同的实现算法.
2737 0