一.模式定义
策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化。
Strategy Pattern: Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
二.模式要素
Context: 环境类
Strategy: 抽象策略类
ConcreteStrategy: 具体策略类
三.举例说明
假设你要从上海去北京,那你有很多种策略可以达到这样的目的。比如坐火车去北京,再比如坐飞机去北京。这两种策略最终都能达到目的。策略模式会对这两种策略进行封装,使得外部在调用时可以根据需要灵活地改变策略。比如预算少就坐火车去,预算多就坐飞机去。封装的这个类其实就是Context环境类,那怎样用策略模式写出代码呢?
四.具体代码
IStrategy.java 策略接口
package stratagyPattern;
/**
* 描述:
* IStratagy
*
* @author Lei Dong
* @create 2019-04-29 14:59
*/
public interface IStratagy {
void executeStratagy();
}
StragetyA.java 策略A
package stratagyPattern;
/**
* 描述:
* StratagyA
*
* @author Lei Dong
* @create 2019-04-29 15:00
*/
public class StratagyA implements IStratagy {
@Override
public void executeStratagy() {
System.out.println("坐火车去北京");
}
}
StragetyB.java 策略B
package stratagyPattern;
/**
* 描述:
* StratagyA
*
* @author Lei Dong
* @create 2019-04-29 15:00
*/
public class StratagyB implements IStratagy {
@Override
public void executeStratagy() {
System.out.println("坐飞机去北京");
}
}
Context.java 环境包装类
package stratagyPattern;
/**
* 描述:
* Context
*
* @author Lei Dong
* @create 2019-04-29 15:00
*/
public class Context {
private IStratagy stratagy;
public Context(IStratagy strategy) {
this.stratagy = strategy;
}
public void executeStratagy() {
stratagy.executeStratagy();
}
}
Main.java
package stratagyPattern;
/**
* 描述:
* Main
*
* @author Lei Dong
* @create 2019-04-29 14:58
*/
public class Main {
public static void main(String[] args) {
Context context1 = new Context(new StratagyA());
context1.executeStratagy();
Context context2 = new Context(new StratagyB());
context2.executeStratagy();
}
}
运行结果:
五.总结
1.策略模式的优点
(1)策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
(2)策略模式提供了管理相关的算法族的办法。
(3)策略模式提供了可以替换继承关系的办法。
(4)使用策略模式可以避免使用多重条件转移语句。
2.策略模式的缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
(2)策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。
3.模式适用场景
在以下情况下可以使用策略模式:
(1)如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
(2)一个系统需要动态地在几种算法中选择一种。
(3)如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
(4)不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。