Design patterns 观察者/ Java

例子

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