关于无国籍战略的困惑

时间:2015-06-29 10:57:17

标签: design-patterns

在战略设计模式中,提到了无国籍战略。有谁可以通过回答以下问题来帮助我理解它:

  1. 这种无国籍战略是什么?
  2. 它解决了什么问题以及如何解决?
  3. 何处使用&不要用这个吗?
  4. Dis(a)相同的优点
  5. 如果可以通过举例说明所有这些,我将非常感激。

1 个答案:

答案 0 :(得分:4)

这种无国籍战略是什么?

无国籍战略是战略的“运行”不会影响另一个战略的战略。

以下是挑选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();
    }
}

上下文对象也是一种可以说是更清晰的设计。最后一个选择是世界的属性,而不是策略,所以它不应该是它的成员。