环境角色:持有一个Strategy类的的引用。
抽象策略角色:通常由一个抽象类或接口实现。
具体策略角色:包装了相关的算法或行为。
public class StrategyDemo { interface Strategy { Double strategyInterface(Double price); } static class SmallDiscountStrategy implements Strategy{ @Override public Double strategyInterface(Double price) { return price*0.88; } } static class BigDiscountStrategy implements Strategy{ @Override public Double strategyInterface(Double price) { return price*0.75; } } public static void main(String[] args) { Double carPrice = 300000.00; Strategy strategy; System.out.println("想买一辆车,车价30W,走普通客户路线吧"); strategy = new SmallDiscountStrategy(); System.out.println("折扣后的车价:"+strategy.strategyInterface(carPrice)); System.out.println("太贵了,还好亲戚是总经理,走大客户路线吧"); strategy = new BigDiscountStrategy(); System.out.println("折扣后的车价:"+strategy.strategyInterface(carPrice)); } }
想买一辆车,车价30W,走普通客户路线吧
折扣后的车价:264000.0
太贵了,还好亲戚是总经理,走大客户路线吧
折扣后的车价:225000.0
策略模式的优缺点:
优点:
1.可以使用继承实现将策略的公共代码迁移到父类中,从而避免重复的代码
2.策略扩展不再需要修改原有代码,只需继承实现策略接口即可,符合开闭原则
3.使用策略模式可以避免使用多重条件判断语句,利于维护
缺点:
1.客户端必须知道所有的策略实现类,并自行决定使用哪一个
扩展,策略模式与函数式编程:
在函数式编程中,将函数的行为传递给调用者,而策略模式正是描述行为的一个最好体现,所以在函数式编程中策略模式应用的十分广泛,也更容易理解。