java设计模式-策略模式
一、什么是策略模式?
策略模式是一种行为设计模式,它使得你能在一个上下文对象中动态地切换不同的算法或行为。策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式使得算法可以独立于使用它的客户端。
在策略模式中,我们创建了一个抽象策略类(Strategy),这个类定义了所有策略应该具有的接口。然后,我们为每种策略创建了一个具体的实现类。客户端根据当前的情况选择一个具体的策略。
二、代码
抽象策略类
public interface Strategy {
void execute();
}
策略实现类
public class StrategyA implements Strategy{
@Override
public void execute() {
System.out.println("使用算法A");
}
}
public class StrategyB implements Strategy{
@Override
public void execute() {
System.out.println("使用算法B");
}
}
public class StrategyC implements Strategy{
@Override
public void execute() {
System.out.println("使用算法C");
}
}
上下文类
public class Context {
private Strategy strategy;
public void executeStrategy() {
this.strategy.execute();
}
public Context(Strategy strategy) {
this.strategy = strategy;
}
}
测试类
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要使用的算法:");
String str = scanner.next();
Context context = null;
if (str.equals("A")) {
context = new Context(new StrategyA());
} else if (str.equals("B")){
context = new Context(new StrategyB());
} else if (str.equals("C")) {
context = new Context(new StrategyC());
}
context.executeStrategy();
scanner.close();
}
}
测试结果:
请输入要使用的算法:
A
使用算法A
上面测试类中客户端根据自己需求来使用对应的算法策略,但是要根据一系列if-else的复杂判断来使用具体的算法策略,我们可以使用简单工厂加map来优化代码。
简单工厂加map优化
public class StrategyFactory {
private Map<String, Strategy> map = new HashMap<>();
public StrategyFactory() {
map.put("A",new StrategyA());
map.put("B",new StrategyA());
map.put("C",new StrategyC());
}
public Strategy getStrategy(String type) {
return map.get(type);
}
}
优化后的测试类
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
StrategyFactory factory = new StrategyFactory();
Context context = new Context(factory.getStrategy(str));
context.executeStrategy();
scanner.close();
}
}
三、总结
策略模式优点:
1.避免了多重条件判断增加系统的复杂性
2.算法独立于客户端,算法的修改不会影响到客户端代码
3.将算法封装在独立的Stratygy中,易于扩展和切换,符合开闭原则
策略模式缺点:
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类
2.会造成很多的策略类。