依赖策略
Strategy with dependency
所以有一个 class 叫做字典。它的方法之一是
public boolean isRight(String word);
搜索单词是否在单词集合中(已封装)。
private Set<String> rightWords;
所以,我想对不同类型的搜索进行基准测试,这就是我尝试在该方法中应用策略模式的原因。
public boolean isRight(String word){
Strategy st = new FastStrategy(word);
st.search();
// else...
}
那么,既然我应该查看 rightWords
变量,我应该将它传递给策略的构造函数吗?但是由于单词的原始集合是私人策略,因此无法访问它。
我该怎么办?
此外,如果我将依赖项传递给策略,它是否仍然是策略模式?
您可以将您的策略作为输入传递给您的 isRight()
方法,它仍然是一个策略模式。 Collections.sort()
是策略模式的最佳示例之一,它将 Comparator
.
作为输入
但是,您不应该使用输入 Strategy st = new FastStrategy(word);
来初始化您的 Strategy 对象,另一方面,将 String word
作为输入传递给您的 search()
方法。例如:
public boolean isRight(String word, Strategy st){
..
st.search(word);
// else...
}
由于您要定义的那些策略是大海捞针的各种方法,因此您不需要在其中保留任何状态。
如果使它们成为无状态的,则可以在每次调用时同时提供 word
和 rightWords
作为方法参数。
至于定义它们的方法,我会投票支持枚举(如果您不使用 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 在构造时接受一个策略(使用接口类型,而不是上面定义的实际枚举):
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);
}
}
所以有一个 class 叫做字典。它的方法之一是
public boolean isRight(String word);
搜索单词是否在单词集合中(已封装)。
private Set<String> rightWords;
所以,我想对不同类型的搜索进行基准测试,这就是我尝试在该方法中应用策略模式的原因。
public boolean isRight(String word){
Strategy st = new FastStrategy(word);
st.search();
// else...
}
那么,既然我应该查看 rightWords
变量,我应该将它传递给策略的构造函数吗?但是由于单词的原始集合是私人策略,因此无法访问它。
我该怎么办?
此外,如果我将依赖项传递给策略,它是否仍然是策略模式?
您可以将您的策略作为输入传递给您的 isRight()
方法,它仍然是一个策略模式。 Collections.sort()
是策略模式的最佳示例之一,它将 Comparator
.
但是,您不应该使用输入 Strategy st = new FastStrategy(word);
来初始化您的 Strategy 对象,另一方面,将 String word
作为输入传递给您的 search()
方法。例如:
public boolean isRight(String word, Strategy st){
..
st.search(word);
// else...
}
由于您要定义的那些策略是大海捞针的各种方法,因此您不需要在其中保留任何状态。
如果使它们成为无状态的,则可以在每次调用时同时提供 word
和 rightWords
作为方法参数。
至于定义它们的方法,我会投票支持枚举(如果您不使用 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 在构造时接受一个策略(使用接口类型,而不是上面定义的实际枚举):
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);
}
}