设计模式-策略模式

过去的,未来的
2020-01-21 / 0 评论 / 0 点赞 / 647 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2020-01-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1、简单介绍

策略模式(Strategy Pattern)属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

2、策略模式主要由这三个角色组成,环境角色(Context)、抽象策略角色(Strategy)和具体策略角色(ConcreteStrategy)。

  • 环境角色(Context):持有一个策略类的引用,提供给客户端使用。
  • 抽象策略角色(Strategy):这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  • 具体策略角色(ConcreteStrategy):包装了相关的算法或行为。

3、我们来写个例子(计算器的功能)

1)定义一个抽象策略角色
public interface CalculateStrategy {
    int operation(int num1, int num2);
}
2)具体策略角色并实现方法。
  • 第一个策略加法
public class addCalculate implements CalculateStrategy {
    @Override
    public int operation(int num1, int num2) {
        return num1 + num2;
    }
}
  • 第二个策略减法
public class SubCalculate implements CalculateStrategy {
    @Override
    public int operation(int num1, int num2) {
        return num1 - num2;
    }
}
3)定义一个环境角色
public class CalculatorContext {

    private CalculateStrategy calculateStrategy;

    public CalculatorContext(CalculateStrategy calculateStrategy) {
        this.calculateStrategy = calculateStrategy;
    }

    public int executeStrategy(int num1, int num2) {
        return calculateStrategy.operation(num1, num2);
    }

}
4)测试代码
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 7;
        CalculatorContext calculatorContext = new CalculatorContext(new SubCalculate());
        int result = calculatorContext.executeStrategy(num1, num2);
        System.out.println(result);
    }

4、总结

1)优点

扩展性好,可以在不修改对象结构的情况下,为新的算法进行添加新的类进行实现;
灵活性好,可以对算法进行自由切换;

2)缺点

使用策略类变多,会增加系统的复杂度。;
客户端必须知道所有的策略类才能进行调用;

3)使用场景

如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为;
一个系统需要动态地在几种算法中选择一种;
如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现;

0

评论区