Radio

一个小小程序员

0%

策略模式

策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

与状态模式的比较

状态模式的类图和策略模式类似,并且都是能够动态改变对象的行为。但是状态模式是通过状态转移来改变 People 所组合的 State 对象,而策略模式是通过 Num 本身的决策来改变组合的 Strategy 对象。所谓的状态转移,是指 People 在运行过程中由于一些条件发生改变而使得 State 对象发生改变,注意必须要是在运行过程中。

状态模式主要是用来解决状态转移的问题,当状态发生转移了,那么 People 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 People 使用的算法。

示例演示:
  1. 创建一个策略接口

    1
    2
    3
    4
    5
    6
    7
    package test.strategy;

    public interface Strategy {

    public int execute(int num1, int num2);

    }
  2. 分别写一个加法,一个减法的具体实现类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    package test.strategy;

    public class Add implements Strategy {

    @Override
    public int execute(int num1, int num2) {
    return num1 + num2;
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package test.strategy;

    public class Subtract implements Strategy {

    @Override
    public int execute(int num1, int num2) {
    return num1 - num2;
    }
    }
  3. 编写Num具体类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package test.strategy;

    public class Num {
    private Strategy strategy;

    public void SetStrategy(Strategy strategy) {
    this.strategy = strategy;
    }

    public int execute(int num1, int num2) {
    return strategy.execute(num1, num2);
    }
    }
  4. 完成上述步骤,我们就可以开始演示了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package test.strategy;

    public class StrategyDemo {
    public static void main(String[] args) {
    Num num = new Num();
    num.SetStrategy(new Add());
    System.out.println("10+6=" + num.execute(10, 6));
    num.SetStrategy(new Subtract());
    System.out.println("10-6=" + num.execute(10, 6));
    }
    }

    演示结果:

    1
    2
    10+6=16
    10-6=4
说明:

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

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

欢迎关注我的其它发布渠道