实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。
例如:超时收银员根据普通客户还是Vip客户来选择是否打折,类图由下所示
策略模式的优点有:
1. 将策略分开,每一种策略可以独立变化,而且提供了一个策略管理类,。
2. 提供继承的方式来封装算法,实现了动态的选择策略,分离了使用者的行为及算法策略。
3. 将每一种策略都封装好,通过环境类来选择使用哪种类,而不需要用分支语句来维护策略的选择。这样后期维护的时候非常的方便,健壮性更强。
策略模式的缺点有:
1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
2. 策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。