观察者模式允许类的用户预订在此类处理数据等时发生的事件,并在这些事件发生时得到通知。在下面的示例中,我们创建了一个处理类和一个观察者类,如果发现短语长于5个字母,则会在处理短语时得到通知。
该LongWordsObserver接口定义了观察者。实施此接口以便向事件注册观察者。
// 可以注册并接收通知的观察值
public interface LongWordsObserver {
void notify(WordEvent event);
}该WordEvent班是一旦发生特定事件时,将被发送到观察者的类事件(在这种情况下,发现长字)
// 一个事件类,其中包含找到的长字
public class WordEvent {
private String word;
public WordEvent(String word) {
this.word= word;
}
public String getWord() {
return word;
}
}该PhraseProcessor班是处理给定词的类。它允许观察者使用该addObserver方法进行注册。一旦找到长单词,将使用WordEvent该类的实例调用这些观察者。
import java.util.ArrayList;
import java.util.List;
public class PhraseProcessor {
// 观察员名单
private List<LongWordsObserver> observers = new ArrayList<>();
// 注册观察员
public void addObserver(LongWordsObserver observer) {
observers.add(observer);
}
// 告知所有观察者,发现了一个长字
private void informObservers(String word) {
observers.forEach(o -> o.notify(new WordEvent(word)));
}
//主要方法-处理一个短语并寻找长单词。如果发现这样,
// 通知所有观察员
public void process(String phrase) {
for (String word : phrase.split(" ")) {
if (word.length() > 5) {
informObservers(word);
}
}
}
}该LongWordsExample级显示如何注册观察员,调用process方法和接收警报时,发现长的单词。
import java.util.ArrayList;
import java.util.List;
public class LongWordsExample {
public static void main(String[] args) {
// 创建找到长单词时要填充的单词列表
List<String> longWords = new ArrayList<>();
// 创建PhraseProcessor类
PhraseProcessor processor = new PhraseProcessor();
// 注册观察员 and specify what it should do when it receives events,
// 即在长字列表中附加长字
processor.addObserver(event -> longWords.add(event.getWord()));
// 调用过程方法
processor.process("Lorem ipsum dolor sit amet, consectetuer adipiscing elit");
// 处理完成后显示长单词列表
System.out.println(String.join(", ", longWords));
// 主持人,贴心的
}
}