在软件开发中,我们经常会遇到在实现一个功能的时候会有多种不同的途径,每一个途径都对应一种算法,此时我们可以使用策略模式来实现灵活地选择解决途径。
策略模式的定义
在策略模式中,定义了一些独立的类来封装不同的算法,每个类封装一种具体的算法。每个封装算法的类都可以称为一种策略。
策略模式的主要目的时将算法的定义和使用进行分开,也就是将算法的行为和环境分开。将算法的定义专门放在专门的策略类中,每个策略类封装了一种实现算法。
策略模式:定义一系列算法类,将每一个算法类封装起来,并让它们可以相互替换。
其UML类图如下所示
从UML类图中不难看出策略模式主要包含了以下三个角色
(1)Context(环境类):环境类时使用算法的角色,它在解决某个问题时可以采用多种策略。
(2)Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类。
(3)ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法。
其典型代码如下:
环境类
class Context
private AbstractStrategy strategy; //维持一个对抽象策略类的引用
public void setStrategy(AbstractStrategy strategy){
this.strategy = strategy;
}
//调用策略类中的算法
public void algorithm(){
strategy.algorithm();
}
}
抽象策略类
abstract class AbstrategyStrategy{
public abstract void algorithm();
}
具体策略类
class ConcreteStartegyA extends AbstractStrategy{
//算法的具体实现
public void algorithm()
//算法A
}
}
策略模式总结
策略模式对应于解决某一问题的一个算法族。
主要优点
(1)策略模式提供了对开闭原则的完美支持,用户可以在不修改原有代码的基础上选择算法和行为,也可以灵活的增加新的算法和行为
(2) 使用策略模式可以避免多重条件选择语句
(3)策略模式提供了一种算法的服用机制
(4)策略模式提供了一种可以替换继承关系的办法
主要缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪个策略类。
(2)会造成系统产生很多的策略类,任何微小的变化都会导致系统中新增一个策略类。
(3)无法同时在客户端使用多个策略类。不支持使用一个策略类完成一部分功能后再使用另一个策略类来完成剩余功能的情况。
适用场景
在以下场景可以考虑适用策略类
(1)一个系统需要动态地在几种算法中选择一种。
(2) 消除多重条件选择语句
(3)不希望客户端知道复杂的,与算法相关的数据结构。
标签:封装,策略,void,模式,strategy,算法,设计模式 From: https://blog.csdn.net/qq_41332630/article/details/139282290