策略模式:抽象一个算法,并封装不同的算法,使得不同算法之间可以相互切换。
优点:扩展性良好,不同算法之间可以自由切换,不需要冗余的if-else语句
标准类图:
抽象算法:
public interface Strategy {
void algorithm();
}
具体算法:
public class ConcreteStrategy1 implements Strategy{
@Override
public void algorithm() {
System.out.println("这是算法1");
}
}
public class ConcreteStrategy2 implements Strategy{
@Override
public void algorithm() {
System.out.println("这是算法2");
}
}
算法封装器:
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy){
this.strategy = strategy;
}
public void algorithmInterfaceMethod(){
strategy.algorithm();
}
}
场景类:
public class Client {
public static void main(String[] args) {
Strategy strategy1 = new ConcreteStrategy1();
Strategy strategy2 = new ConcreteStrategy2();
Context context = new Context(strategy1);
context.algorithmInterfaceMethod();
context.setStrategy(strategy2);
context.algorithmInterfaceMethod();
}
}
上述为普通策略模式,经过扩展之后可以变成策略枚举,如果算法不是经常变化,比较固定,可以使用策略枚举模式(枚举结构固定,不易扩展):
public enum StrategyEnum {
STRTEGY1("strategy1"){
@Override
public void algorithm() {
System.out.println("这是算法1");
}
},
STRTEGY2("strategy2"){
@Override
public void algorithm() {
System.out.println("这是算法2");
}
};
private String name;
private StrategyEnum(String name){
this.name = name;
}
public String toString(){
return this.name;
}
public abstract void algorithm();
}
场景类:
public class Client {
public static void main(String[] args) {
StrategyEnum.STRTEGY1.algorithm();
StrategyEnum.STRTEGY2.algorithm();
}
}