策略模式
- 策略模式属于对象的行为模式,主要是是针对一组算法,将每一个算法封装到具有共同接口的抽象的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
- 策略模式把一个系列的算法封装到一个系列的具体策略类里面,作为一个抽象策略类的子类或策略接口的实现类。
- 主要适用于完成同一个共同目标而需要提出不同具有动态性并且具有差异的方案,比如针对同一个商品不同时期不同人的打折情况;一个人去旅游他所选择的各种出行方式等等。
UML图
1、UML图:
2、角色:
- 环境(
Context
)角色:持有一个Strategy抽象策略类或策略接口的引用。 - 抽象策略(
Strategy
)角色:这是一个抽象角色,由一个接口或抽象类实现。此角色声明所有的具体策略类需要重写的方法。 - 具体策略(
ConcreteStrategy
)角色:封装了相关的算法或行为。
3、优缺点:
- 因为继承/实现可以Override, 所以可以独立立马实现不同的策略,而不影响其他策略。
- 可以提供相同行为的不同实现。客户可以根据不同时间 /空间权衡取舍要求从不同策略中进行选择。
- 可以动态的改变对象的行为。
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式将造成产生很多策略类。
举例代码实现
我们需要传入一个字符串,通过不同的策略实现不同的功能。简单来说就是创建一个能够根据传递的参数对象的不同而具有对字符串不同操作行为的方法
策略 | 目的 |
---|---|
Upcase | 字符串全部大写 |
Downcase | 字符串全部小写 |
Splitter | 字符串根据空格分割为数组 |
1、抽象策略类:抽象角色,由一个接口或抽象类实现。此角色声明所有的具体策略类需要重写的process
方法。
class StrategyModel {
public String name() {
return getClass().getSimpleName();
}
//传入不同的策略
//不同的策略通过继承或接口实现来完成的
//最主要的是通过利用多态+重写方法
Object process(Object input) {
return input;
}
}
2、具体策略实现类:封装相关算法或行为,通过继承抽象策略类并且重写process
方法完成不同的策略。
//策略A:字符串全部变成大写
class Upcase extends StrategyModel{
@Override
String process(Object input) {
return ((String)input).toUpperCase();
}
}
//策略B:字符串全部变成小写
class Downcase extends StrategyModel{
@Override
String process(Object input) {
return ((String)input).toLowerCase();
}
}
//策略C:字符串空格分割
class Splitter extends StrategyModel{
@Override
String process(Object input) {
return Arrays.toString(((String)input).split(" "));
}
}
3、环境角色类:持有一个Strategy抽象策略类或策略接口的引用,即StrategyModel s
引用,具体利用多态实现传入三个具体策略。
public class Apply{
public static void process(StrategyModel s, Object o) {
System.out.println("Using Processer "+ s.name());
System.out.println(s.process(o));
}
public static String s = "There are three string of strategy";
public static void main(String[] args) {
//利用多态传入策略类实现具有不同行为的方法
process(new Upcase(), s);
process(new Downcase(), s);
process(new Splitter(), s);
}
}
结果对三种不同的策略得到三种不同的结果:
Using Strategy: Upcase
THERE ARE THREE STRING OF STRATEGY
Using Strategy: Downcase
there are three string of strategy
Using Strategy: Splitter
[There, are, three, string, of, strategy]