观察者模式允许类的用户预订在此类处理数据等时发生的事件,并在这些事件发生时得到通知。在下面的示例中,我们创建了一个处理类和一个观察者类,如果发现短语长于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)); // 主持人,贴心的 } }