策略(Strategy)模式属于对象的行为模式,又叫政策(Policy)模式。
策略模式的用意是:针对一组算法,将每一个算法封装到具有共同接口的独立的具体类中,从而使得它们可以相互替换。
策略模式结构与角色:
环境(Context)角色:持有一个Strategy类的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
策略模式实现需要注意的地方:
1、 经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到公共的抽象策略角色Strategy类里面。当然这时候抽象策略角色必须要用Java抽象类实现,而不能使用Java接口。
2、 策略模式在每一个时刻都只能使用一个策略对象,但是有时候一个应用程序与几个策略对象相联系。换言之,在应用程序启动时,所有的策略对象就已经被创立出来,而应用程序可以在几个策略对象之间调换。这只有在策略对象不会耗费很多计算机内存资源的情况下才可行,只有在策略对象的初始化会花费很长时间的情况下才需要。
使用策略模式的情况:
1、 如果在一个系统里面有许多类,它们之间的区别仅在于他们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、 一个系统需要动态地在几种算法中选择一种。
3、 一个系统的算法使用的数据不可以让客户端知道。
4、 如果一个对象有很多行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句实现。
策略模式的优点:
1、 策略模式提供了管理相关的算法族的办法。
2、 策略模式提供了可以替换继承关系的办法。
3、 使用策略模式可以避免使用多重条件转移语句。
策略模式的缺点:
1、 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
策略模式早成很多的策略类。