定义:定义了算法族,分别封装起来,使它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
- 算法族:使用多种不同的方式处理同一件事情。这些处理方式构成算法族。
- 算法族实现同一个策略接口,客户端在运行时选择使用哪个算法,算法之间可以互相替换,可以说客户端是依赖接口而非实际行为。
使用场景
- 同一问题有多种不同处理方式或者表现形式时。
UML图
- Context使用策略的类:持有Strategy的引用。
- Strategy抽象的策略接口:通常为一个接口或者抽象类。
- ConcreteStrategy具体的策略类:对Strategy的实现,包含具体算法。
代码示例
public class Duck { QuackBehavior quackBehavior; public Duck(QuackBehavior quackBehavior){ this.quackBehavior = quackBehavior; } public void doQuack(){ quackBehavior.Quack(); } } public interface QuackBehavior { void Quack(); } public class QuackBehaviorA implements QuackBehavior { @Override public void Quack() { System.out.println("Quack AAA"); } } public class QuackBehaviorB implements QuackBehavior { @Override public void Quack() { System.out.println("Quack BBB"); } }
测试
public class StrategyTestDemo { public static void main(String[] args){ Duck duck = new Duck(new QuackBehaviorA()); duck.doQuack(); duck = new Duck(new QuackBehaviorB()); duck.doQuack(); } }
运行结果
优点:算法可以切换,*度高
缺点:所有策略类都需要暴露给使用者,行为较多时可能会产生过多的策略类
思考
- 对会员等级的不同特权等场景可能适用。
- 当行为过多时,可能需要搭配其他设计模式处理类膨胀的问题。