策略模式应该是无状态的吗?

问题描述

| 是“四人一组”策略的类必须完全无状态(即没有字段),还是可以包含不可变状态(即最终字段)?     

解决方法

        策略类封装了动作,而不是事物。因此,尽管您确实可以这样做,但是将状态保持在其中并没有多大意义。将其视为动词,而不是名词。或至少作为描述动作的名词。另一方面,您总是可以参数化该策略,并通过方法调用或类似方法将客户端对象的状态传递给它。 同样,一个类是无状态的还是全状态的,实际上并不取决于其字段中的
final
关键字。例子: 当在对象“ 0”上使用时,仅表示不得更改对对象的引用。您仍然可以更改该对象的内容,例如其字段。在这种情况下,您的课程是有状态的,尽管其字段是最终的。 如果该字段确实是一个常数,那么对于大多数意图和目的,您都可以认为它是无状态的。例如,您可以声明一个字段“ 2”,然后确保您从不执行任何操作来更改引用对象的状态。 编辑:让我们尝试区分策略本身的参数和该策略的一个特定执行的参数。如果策略类是无状态的,那么没有多于一个该类的实例是没有意义的,这使对象(而不是类)代表动作本身,而方法执行则代表该策略的一个特定执行。 现在,如果我们有策略本身的参数,则对于该策略的所有执行,该参数具有相同的值才有意义。因此,可以将其放在一个常量方法调用中,该方法返回一个常量(如果我们不需要静态的东西),甚至可以硬编码。如上所述,这可以以无状态方式实现。 另一方面,如果参数描述了该策略的一个特定执行,则只需将其作为参数传递给方法即可。会的。 补充说明:如果我们想让某种动作执行队列具有延迟,计划的执行,则有充分的理由使用状态为'adverbs'的动作对象。那也是-命令。     ,        不,为什么要无状态?该策略可以是任何东西,它只是代表一些运行时可插拔功能单元,使您可以扩展对使用类的修改行为。据我所知,没有任何东西表明无国籍或不变性的要求。     ,        无状态指的是在策略运行之间没有数据保留的事实。也就是说,如果您执行两次相同的策略,则该策略的前一次运行将不会继续执行。这是有好处的,因为它免除了您在需要时“重置”战略实施的麻烦。 请注意,在对策略模式实现的描述中,它们引用了包含策略需要执行的数据的上下文(在我的书中的第317页)。实现所需的所有“状态”都应该放在这些上下文对象中。 这意味着策略实现本身是无状态的,但是随着所需数据在上下文中传递,整个模式都处于状态。 例如,如果您有用于数学运算的策略实现,则至少有两种方法可以实现。首先是在构造策略实现时,在策略实现上设置arg1和arg2(以及3和4 ...)。然后,当您执行该实现时,将抓取其字段并执行操作。问题是,如果再次运行相同的实现,则必须重置其所有字段(或创建一个新的实现)。 第二种方法是创建一个包含所有参数的上下文。策略的实现将从上下文中获取所需的值。然后,您可以重用策略实施的每个实例,每次仅传递一个新的上下文。不必担心重新创建实现的新实例,或忘记重置实现实例。当然,您仍然需要正确管理上下文。     ,策略模式的目的是直接在方法本地范围内处理策略方法参数。策略类本身当然可以在需要时保留某些字段,但是绝不应该将方法参数分配给这些字段,因为如果多次使用该策略对象,它可能会引起线程安全问题。     ,        是的,因为这主要是算法选择器。具体算法可以有状态,但没有选择器。 顺便说一句,在这种策略中,我们没有一门课。您是指哪个具体课程?扮演什么角色?     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...