''' 入门级示例,是用来帮助理解其他例子 把观察者挂到自己的处理队列上 适当时机调用所有队列上的约定的观察者的 update 方法 如果观察者有多个职能参与不同的任务链,不一定要统一命名update方法 这是一个示例性质的原型,具体环境下需要调整 ''' import collections from abc import ABC, abstractmethod from cppy.cp_util import * # 定义观察者接口 ,在 Pyhon中并不是必须 class Observer(ABC): @abstractmethod def update(self, word): pass # 定义具体观察者类,用于统计词频 class WordFrequencyObserver(Observer): def __init__(self): self.word_count = collections.Counter() def update(self, word): self.word_count[word] += 1 # 定义主题类 class WordSubject: def __init__(self): self.observers = [] def attach(self, observer): self.observers.append(observer) def notify(self, word): for observer in self.observers: observer.update(word) # 主函数 def main(testfilepath, top_n = 10 ): stopwords = get_stopwords() subject = WordSubject() # 创建一个观察者并附加到主题 observer = WordFrequencyObserver() subject.attach(observer) # 处理文件 wordlist = re_split( read_file(testfilepath) ) for word in wordlist: if word not in stopwords: subject.notify(word) # 通知 # 打印最高的N个词频 top_words = observer.word_count.most_common(top_n) print_word_freqs(top_words) if __name__ == "__main__": main( testfilepath )