设计模式-策略模式
策略模式(strategy pattern)
策略模式(strategy pattern):策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的类中,从而使它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
策略模式结构
Context是上下文,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用;
Strategy是策略类,用于定义所有支持算法的公共接口;
ConcreteStrategy是具体策略类,封装了具体的算法或行为,继承于Strategy。
代码:
//环境角色(Context): 持有一个Strategy类的引用 public class Context{ //Strategy类的引用 private Strategy strategy; //设置具体的策略 public void setStrategy(Strategy strategy){ this.strategy = strategy; } //执行策略的相关算法 public void contextInterface(){ strategy.algorithmInterface(); } } //抽象策略角色(Strategy): //这是一个抽象角色,通常由一个接口或抽象类来实现。 //此角色给出所有具体策略类所需实现的接口。 public interface Strategy{ public void algorithmInterface(); } //具体策略角色(ConcreteStrategy):包装了相关算法或行为。 public class concreteStrategy{ public void algorithmInterface(){ System.out.println("这是算法"); } }
设计原则
1、找出应用中需要变化之处,把它们独立出来、不要和那些不需要变化的代码混在一起
2、针对接口编程,而不是针对实现编程
3、多用组合、少用继承
优点:
1、 策略类之间可以自由切换。由于策略类都实现同一个接口,所以使它们之间可以自由切换。
2、 易于扩展。增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码。
3、 避免使用多重条件选择语句,充分体现面向对象设计思想。
缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2、策略模式会造成很多的策略类。
应用场景:
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。