本文来说下策略模式
概述
定义一系列算法或者行为,将每一个算法或者行为封装起来,并让它们可以相互替换。
今天给大家分享的是策略模式,具体内容大纲如下:
解决:使用 if…else 所带来的复杂和难以维护。
策略模式通用代码
Strategy
package cn.wideth.strategy;
public interface Strategy {
int calculate(int a,int b);
}
AddCalculate
package cn.wideth.strategy;
public class AddCalculate implements Strategy {
@Override
public int calculate(int a, int b) {
return a+b;
}
}
SubCalculate
package cn.wideth.strategy;
public class SubCalculate implements Strategy {
@Override
public int calculate(int a, int b) {
return a-b;
}
}
Context
package cn.wideth.strategy;
public class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy){
this.strategy = strategy;
}
public int calculate(int a,int b){
return strategy.calculate(a,b);
}
}
测试
package cn.wideth.strategy;
public class Main {
public static void main(String[] args) {
//选择一个具体策略
Strategy strategy = new AddCalculate();
//来一个上下文环境
Context context = new Context();
context.setStrategy(strategy);
//客户端直接让上下文环境执行算法
System.out.println(context.calculate(10,2));
System.out.println("===================");
strategy = new SubCalculate();
context.setStrategy(strategy);
System.out.println(context.calculate(10,2));
}
}
测试结果
优缺点
优点
1.策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新 的算法或行为
2.使用策略模式可以避免使用多重条件转移语句。
缺点
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2.策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。
策略模式使用场景
在日常开发中,策略模式适用于以下三种场景:
- 针对同一类型问题,有多重处理方式,每一种都能独立解决问题。
- 算法需要自由切换的场景。
- 需要屏蔽算法规则的场景
本文小结
好了,今天的策略模式就到这里。其实,设计模式在大多数情况下,是不会单独存在的,都是使用多种设计模式混合起来使用的。策略模式使用的就是面向对象的继承和多态机制,从而实现同一行为在不同场景下不同实现。