设计模式之——策略(Strategy)模式
策略模式定义
指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。
策略模式的优点
- 可以避免使用多重条件语句,去掉if-else的最佳选择;
- 提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的;
- 满足开闭原则,可以在不修改原代码的情况下,灵活增加新算法。
策略模式的缺点
- 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
- 策略模式造成很多的策略类。
策略模式的实现
定义一个抽象策略
/**
* @ClassName AbstractStrategy
* @Description TODO
* @Author mamingcong
* @Date 2020/6/16 18:03
* @Version 1.0
*/
public abstract class AbstractStrategy {
public abstract void abstrategyMethod();
}
定义2个具体策略
/**
* @ClassName RealStrategy1
* @Description TODO
* @Author mamingcong
* @Date 2020/6/16 18:06
* @Version 1.0
*/
public class RealStrategy1 extends AbstractStrategy{
@Override
public void abstrategyMethod() {
System.out.println("RealStrategy1的方法执行了");
}
}
/**
* @ClassName RealStrategy2
* @Description TODO
* @Author mamingcong
* @Date 2020/6/16 18:10
* @Version 1.0
*/
public class RealStrategy2 extends AbstractStrategy{
@Override
public void abstrategyMethod() {
System.out.println("RealStrategy2的方法执行了");
}
}
定义一个环境类
/**
* @ClassName Context
* @Description TODO
* @Author mamingcong
* @Date 2020/6/16 18:08
* @Version 1.0
*/
public class Context {
private AbstractStrategy abstractStrategy;
public AbstractStrategy getAbstractStrategy() {
return abstractStrategy;
}
public void setAbstractStrategy(AbstractStrategy abstractStrategy) {
this.abstractStrategy = abstractStrategy;
}
public void strategyMethod()
{
abstractStrategy.abstrategyMethod();
}
}
测试
/**
* @ClassName Test
* @Description TODO
* @Author mamingcong
* @Date 2020/6/16 18:10
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
Context context = new Context();
AbstractStrategy abstractStrategy = new RealStrategy1();
context.setAbstractStrategy(abstractStrategy);
context.strategyMethod();
abstractStrategy = new RealStrategy2();
context.setAbstractStrategy(abstractStrategy);
context.strategyMethod();
}
}
运行结果
RealStrategy1的方法执行了
RealStrategy2的方法执行了
策略模式的使用场景
- 一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中。
- 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句。
- 系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时。
- 系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。
- 多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。