策略模式定义一组算法,并将每个算法都用类封装起来,实现同一接口,使得算法之间能够相互转换。策略模式使用的是面向对象的继承和多态机制。
策略模式的三种角色
1.Context封装角色
也叫做上下文角色,起承上启下的封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的策略上的变化
2.Strategy抽象策略角色
策略、算法族的抽象,通常为接口定义每个策略或者算法必须实现的方法
3.ConcreteStrategy具体策略角色
实现抽象决策中的方法,包含具体的算法
UML图
代码样例:得到雇员薪水大于8000块钱的策略
public interface EmpStrategy {
boolean condition(Employee employee);
}
public class HighSalaryEmpStrategy implements EmpStrategy {
@Override
public boolean condition(Employee employee) {
if(employee.getSalary() >= 8000) return true;
return false;
}
}
public static List<Employee> filterEmpList(List<Employee> emps,EmpStrategy strategy){
List<Employee> employees = new ArrayList<>();
for(Employee employee : emps) {
if(strategy.condition(employee)) {
employees.add(employee);
}
}
return employees;
}
同样地,能够通过实现EmpStrategy接口,定制符合自己需求的策略。
由此可见,策略模式的可扩展性好,策略(算法)之间能够自由切换。