2015-06-29 55 views
2

在策略设计模式中,提到了无状态策略。任何人都可以通过回答以下问题来帮助我理解它:关于无状态策略的困惑

  1. 什么是无状态策略?
  2. 它解决了什么问题?
  3. 使用地方&不使用?
  4. 派息(一)同一

dvantages我会高度赞赏,如果这一切都可以通过给一个例子来说明。

+0

*在策略设计模式中,提到了无状态策略*。请链接或引用。这就是说,无状态策略是没有任何状态的Strategy接口的具体实现。 :) – CKing

+1

根据四本书的策略模式的后果:对象数量增加。策略增加了应用程序中对象的数量。有时候,你可以通过实施策略来减少这种开销,这些策略可以作为环境可以共享的无状态对象。任何剩余状态由上下文维护,该上下文将每个请求传递给策略对象。共享策略不应该在调用之间保持状态。 Flyweight(218)模式更详细地描述了这种方法。 –

回答

2

什么是无状态策略?

无状态策略是策略的一个“运行”不会影响另一个策略的策略。

这里有采摘truefalse两种策略:

public final class FlipStrategy { 

    private boolean lastPick; 

    public boolean pick() { 

     lastPick = !lastPick; 

     return lastPick; 
    } 
} 

和...

public final class RandomStrategy { 

    public boolean pick() { 

     return (new Random()).nextBoolean(); 
    } 
} 

FlipStrategy是有状态的策略。你得到的结果取决于以前的结果。

RandomStrategy是一种无国籍策略。你得到的结果是相互独立的。

它解决了什么问题?

无状态的策略...

  • 可以在没有一个用户改变的另一个
  • 结果(通常)是线程安全的,让他们在线程之间共享安全共享
  • 具有较少的内存开销,因为一个实例可以重复使用多次
  • 可以在特定的基础上创建,这可以使程序架构更简单

使用地点&不使用?

使用无状态策略并不总是可行的。设想一个保镖的策略 - 必须记住有多少人已经进入决定是否应该允许更多。

否则,无状态策略会更好。

有时,您可以使用“上下文”对象将有状态策略变为无状态策略。上下文对象将与策略相关的所有状态编码为参数。

在我们前面的例子中,背景可能是:

public final class Context { 

    private final boolean lastPick; 

    public boolean getLastPick() { 
     return lastPick; 
    } 

    public Context(final boolean lastPick) { 

     this.lastPick = lastPick; 
    } 

    // hashCode etc... 
} 

现在FlipStrategy可以在无状态的方式来实现:

public final class FlipStrategy { 

    public boolean pick(final Context context) { 

     return !context.getLastPick(); 
    } 
} 

上下文对象也是可以说是清洁的设计。最后一个选择是世界的财产,而不是战略,所以它不应该是它的一员。