一个“四人帮策略模式”的类是否必须完全无状态(即没有字段),还是可以包含不可变状态(即final字段)?
策略类封装的是行为而非物体。所以虽然你如果真的必须这样做,但在其中保留状态并没有太多意义。把它看作一个动词,而不是名词。或至少是描述一个行动的名词。另一方面,您始终可以将策略参数化,并通过方法调用或类似方式将客户端对象的状态传递给它。
此外,类是无状态还是有状态并不取决于其字段上的final
关键字。例如:
final
仅表示不能更改对对象的引用。您仍然可以更改该对象的内容,例如其字段。在这种情况下,您的类具有状态,尽管其字段是 final 的。private static final
字段,然后确保您永远不会对所引用对象的状态进行任何更改。编辑:让我们试着区分策略本身的参数和一次执行该策略的特定参数。如果策略类是无状态的,则没有必要拥有超过一个该类的实例,这使得对象而非类本身代表行动,而方法执行代表该策略的一个特定执行。
现在,如果我们有一个策略本身的参数,那么这个参数对于所有执行该策略的操作来说都应该具有相同的值。因此,它可以放在常量中,方法调用返回常量(如果我们不想使用静态内容),甚至是硬编码。如上所述,这可以以无状态的方式实现。
另一方面,如果参数描述了策略的一个特定执行,则只需将其作为参数传递给方法即可。就这样。
附加说明:如果我们希望使用带有“副词”打包在其状态中的动作对象,例如带有延迟、调度等执行队列,则使用 Command 模式是有充分理由的。
策略模式的目的是直接在方法的本地范围内处理策略方法参数。当然,策略类本身可以在需要时保留一些字段,但绝不能将方法参数分配给这些字段,因为如果策略对象被多次使用,可能会引入线程安全问题。
是的,因为这主要是算法选择器。具体的算法可以有状态,但选择器没有。
顺便说一下,在这个策略中我们没有一个类。你指的是哪个具体的类?在什么角色下?