Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 依赖策略_Java_Design Patterns_Strategy Pattern - Fatal编程技术网

Java 依赖策略

Java 依赖策略,java,design-patterns,strategy-pattern,Java,Design Patterns,Strategy Pattern,所以我们有一个叫做Dictionary的类。它的一种方法是 public boolean isRight(String word); 它搜索单词是否在单词集合中(已封装) 那么,既然我应该查看rightWords变量,那么我应该把它传递给strategy的构造函数吗?但是由于原始的单词集合是私有的,所以strategy无法访问它 我该怎么办 此外,如果我将依赖项传递给策略,它是否仍然是策略模式?您可以将策略作为输入传递给isRight()方法,它仍然是策略模式Collections.sort(

所以我们有一个叫做Dictionary的类。它的一种方法是

public boolean isRight(String word);
它搜索单词是否在单词集合中(已封装)

那么,既然我应该查看
rightWords
变量,那么我应该把它传递给strategy的构造函数吗?但是由于原始的单词集合是私有的,所以strategy无法访问它

我该怎么办


此外,如果我将依赖项传递给策略,它是否仍然是策略模式?

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

但是,您不应该使用输入
Strategy st=newfaststrategy(word)初始化策略对象字符串单词作为输入传递给
search()
方法。例如:

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

因为你想要定义的那些策略是大海捞针的各种方法,你不需要在其中保留任何状态

如果将它们设置为无状态,则可以在每次调用中提供
word
rightWords
作为方法参数

至于定义它们的方法,我会投票支持enum(实现
java.util.function.BiPredicate
或您自己的接口,如果您不使用Java8):

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

        st.search();
        // else...
}
public boolean isRight(String word, Strategy st){
    ..
    st.search(word);
    // else...
}
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) { ... }
    }
}
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);
    }
}