一、策略设计模式简介
策略设计模式的主要思想就是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使它们可以相互替换。能够根据所传递的参数对象的不同而具有不同行为的方法被称为策略设计模式,这类方法包含所要执行算法中固定不变的部分,而“策略”包含变化的部分,策略就是传递进去的参数对象,它包含要执行的代码。策略模式的最大特点是使算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。
二、策略设计模式的组成
- 抽象的策略略角色通常情况下是接口或者抽象类。
- 具体策略角色继承抽象的策略角色,实现各自的具体的的算法和行为。
- 环境角色内部持有抽象的策略角色的引用,接收客户端向环境角色中传递的具体的策略类。
三、案例
1、定义抽象的策略角色
public abstract class Processor {
public String name(){
return getClass().getSimpleName();
}
abstract String process(Object input);
}
2、定义具体策略角色
public class Downcase extends Processor{
@Override
String process(Object input) {
return ((String)input).toLowerCase();
}
}
public class Upcase extends Processor{
@Override
String process(Object input) {
return ((String)input).toUpperCase();
}
}
public class Splitter extends Processor{
@Override
String process(Object input) {
return Arrays.toString(((String)input).split(" "));
}
}
3、定义环境角色
public class Environment {
private Processor processor;
public void setStrategy(Processor processor){
this.processor = processor;
}
public void fun(String input){
System.out.println("Using processor" + processor.name());
System.out.println(processor.process(input));
}
}
4、测试
public class Test {
public static void main(String[] args){
String str = "Success is getting what you want,Happiness is wanting what you get.";
Environment environment = new Environment();
environment.setStrategy(new Upcase());
environment.fun(str);
environment.setStrategy(new Downcase());
environment.fun(str);
environment.setStrategy(new Splitter());
environment.fun(str);
}
}
输出
Using processorUpcase
SUCCESS IS GETTING WHAT YOU WANT,HAPPINESS IS WANTING WHAT YOU GET.
Using processorDowncase
success is getting what you want,happiness is wanting what you get.
Using processorSplitter
[Success, is, getting, what, you, want,Happiness, is, wanting, what, you, get.]
四、策略模式的特点
策略模式的优点:
(1)结构清晰,降低了耦合度,易于拓展。上例中如果需要再添加一种出行方式,只需要修改较少的已有代码。
(2)对客户隐藏具体策略(算法)的实现细节,封装性更好,数据更安全。
策略模式的缺点:
随着策略数量的增加,具体实现子类会变得越来越多。