依赖战略

时间:2015-11-12 19:02:36

标签: java design-patterns strategy-pattern

所以有一个叫做Dictionary的类。其中一个'方法是

public boolean isRight(String word);

搜索单词是否在单词集合中(已封装)。

private Set<String> rightWords;

所以,我想对不同类型的搜索进行基准测试,这就是为什么我在这个方法中尝试应用策略模式的原因。

public boolean isRight(String word){
        Strategy st = new FastStrategy(word);

        st.search();
        // else...
}

那么,既然我应该查看rightWords变量,我应该通过策略的构造函数传递它吗?但由于单词的原始集合是私有策略,因此无法访问它。

我该怎么办?

另外,如果我将依赖关系传递给策略,它仍然是一种策略模式吗?

2 个答案:

答案 0 :(得分:1)

您可以将您的策略​​作为isRight()方法的输入传递,它仍然是策略模式。 Collections.sort()是策略模式的最佳示例之一,它将Comparator作为输入。

但是,您不应该使用输入Strategy st = new FastStrategy(word);初始化您的策略对象,另一方面,将String word作为输入传递给您的search()方法。例如:

public boolean isRight(String word, Strategy st){
    ..
    st.search(word);
    // else...
}

答案 1 :(得分:0)

由于您想要定义的策略是在大海捞针中查找针的各种方法,因此您无需在其中保留任何状态。

如果使它们成为无状态,则可以在每次调用时同时提供wordrightWords作为方法参数。

至于定义它们的方法,我会投票给一个枚举(如果你不使用Java 8,则实现java.util.function.BiPredicate或你自己的某个接口):

enum LookupStrategy implements BiPredicate<String, Set<String>> {
    FAST_LOOKUP {
        @Override public boolean test(String word, Set<String> rightWords) {
            return rightWords.contains(word);
        }
    },
    SLOW_LOOKUP {
        @Override public boolean test(String word, Set<String> rightWords) { ... }
    }
}

然后你可以让你的Dictionary类在构造时接受策略(使用接口类型,而不是上面定义的实际枚举):

class Dictionary {
    private final Set<String> rightWords;
    private final BiPredicate<String, Set<String>> lookupStrategy;

    Dictionary(Set<String> rightWords, BiPredicate<String, Set<String>> lookupStrategy) {
        // initialize private fields
    }

    boolean isRight(String word) {
        return lookupStrategy.test(word, rightWords);
    }
}