Strategy模式的实现有以下这些需要注意的地方。
经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共有的抽象策略角色Strategy类中。当然这时候抽象策略角色必须要用java抽象类实现,而不能使用java接口。
Strategy模式在每一个时刻都只能使用一个策略对象,但是有的时候一个应用程序同时与几个策略对象相联系。换言之,在应用程序启动时,所有的策略对象就已经被创立出来,而应用程序可以在几个策略对象之间调换。
在下面的情况下应当考虑使用Strategy模式:
如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用Strategy模式可以动态地让一个对象在许多行为中选择一种行为。
一个系统需要动态地在几种算法中选择一个。
一个系统的算法使用的数据不可以让客户端知道。
如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。此时,使用Strategy模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现OO设计的概念。
在以下各种情况下可以使用状态模式:
一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变。
对象在某个方法里依赖于一重或多重的条件转移语句,其中有大量的代码。State模式把条件转移语句的每一个分支都包装到一个单独的类里。这使得这些条件转移分支能够以类的方式独立存在和演化。维护这些独立的类也就不再影响到系统的其他部分。
State模式与Strategy模式的区别
一个简单的方法就是考察环境角色是否有明显的状态和状态的过渡。如果环境角色只有一个状态,那么就应当使用Strategy模式。Strategy模式的特点是:一旦环境角色选择了一个具体策略类,那么在整个环境类的生命周期里它都不会改变这个具体策略类。而State模式则适用于另一种情况,即环境角色有明显的状态转移。
另一个微妙的差别在于,Strategy模式的环境类自己选择一个具体策略类;而State模式的环境类是被外在原因放进一个具体状态中的。
Strategy模式所选的策略往往并不明显地告诉客户端它所选择的具体策略;而状态模式则相反,在State模式里面,环境角色所处的状态是明显告诉给客户端的。
经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共有的抽象策略角色Strategy类中。当然这时候抽象策略角色必须要用java抽象类实现,而不能使用java接口。
Strategy模式在每一个时刻都只能使用一个策略对象,但是有的时候一个应用程序同时与几个策略对象相联系。换言之,在应用程序启动时,所有的策略对象就已经被创立出来,而应用程序可以在几个策略对象之间调换。
在下面的情况下应当考虑使用Strategy模式:
如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用Strategy模式可以动态地让一个对象在许多行为中选择一种行为。
一个系统需要动态地在几种算法中选择一个。
一个系统的算法使用的数据不可以让客户端知道。
如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。此时,使用Strategy模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现OO设计的概念。
在以下各种情况下可以使用状态模式:
一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变。
对象在某个方法里依赖于一重或多重的条件转移语句,其中有大量的代码。State模式把条件转移语句的每一个分支都包装到一个单独的类里。这使得这些条件转移分支能够以类的方式独立存在和演化。维护这些独立的类也就不再影响到系统的其他部分。
State模式与Strategy模式的区别
一个简单的方法就是考察环境角色是否有明显的状态和状态的过渡。如果环境角色只有一个状态,那么就应当使用Strategy模式。Strategy模式的特点是:一旦环境角色选择了一个具体策略类,那么在整个环境类的生命周期里它都不会改变这个具体策略类。而State模式则适用于另一种情况,即环境角色有明显的状态转移。
另一个微妙的差别在于,Strategy模式的环境类自己选择一个具体策略类;而State模式的环境类是被外在原因放进一个具体状态中的。
Strategy模式所选的策略往往并不明显地告诉客户端它所选择的具体策略;而状态模式则相反,在State模式里面,环境角色所处的状态是明显告诉给客户端的。