|
|
'''
|
|
|
注册者 = 观察者
|
|
|
|
|
|
每个组件提供注册消息接口和注册消息动作
|
|
|
|
|
|
在其它单元上注册自己对于特定事件(消息)的响应函数
|
|
|
同时负责自己的注册队列的序贯调用
|
|
|
Python 中有一个Callable类型,可以用来判断是否是可以回调类型
|
|
|
from typing import Callable
|
|
|
|
|
|
这是一个示例性质的原型,具体分布式环境下需要调整
|
|
|
'''
|
|
|
|
|
|
from collections import defaultdict
|
|
|
from cppy.cp_util import *
|
|
|
|
|
|
#
|
|
|
# event_manager
|
|
|
#
|
|
|
class EventManager:
|
|
|
def __init__(self):
|
|
|
self.load_handlers = [] # 用于加载文件的事件处理器
|
|
|
self.process_handlers = [] # 用于处理数据的事件处理器
|
|
|
self.end_handlers = [] # 用于结束流程的事件处理器
|
|
|
|
|
|
def register_load_event(self, handler):
|
|
|
self.load_handlers.append(handler)
|
|
|
|
|
|
def register_process_event(self, handler):
|
|
|
self.process_handlers.append(handler)
|
|
|
|
|
|
def register_end_event(self, handler):
|
|
|
self.end_handlers.append(handler)
|
|
|
|
|
|
# 运行框架,按顺序执行注册的事件处理器
|
|
|
def run(self, file_path):
|
|
|
for handler in self.load_handlers: handler(file_path)
|
|
|
for handler in self.process_handlers: handler()
|
|
|
for handler in self.end_handlers: handler()
|
|
|
|
|
|
|
|
|
#
|
|
|
# 功能组件
|
|
|
#
|
|
|
# 定义数据存储类,用于模拟文件内容的加载和处理
|
|
|
class TextData:
|
|
|
_word_event_handlers = []
|
|
|
|
|
|
def __init__( self, event_manager ):
|
|
|
self._stop_words = get_stopwords()
|
|
|
event_manager.register_load_event(self.__load)
|
|
|
event_manager.register_process_event(self.__process_words)
|
|
|
|
|
|
def __load(self, path_to_file):
|
|
|
self._data = re_split( read_file(path_to_file) )
|
|
|
|
|
|
def __process_words(self):
|
|
|
for word in self._data:
|
|
|
if word not in self._stop_words:
|
|
|
for handler in self._word_event_handlers:
|
|
|
handler(word)
|
|
|
|
|
|
def register_word_event(self, handler):
|
|
|
self._word_event_handlers.append(handler)
|
|
|
|
|
|
|
|
|
class WordFrequencyCounter:
|
|
|
def __init__(self, event_manager, data_storage):
|
|
|
self._word_freqs = defaultdict(int) # 存储单词频率
|
|
|
data_storage.register_word_event(self.__increment_count) # 注册单词事件
|
|
|
event_manager.register_end_event(self.__print_freqs) # 注册结束事件
|
|
|
|
|
|
def __increment_count(self, word):
|
|
|
self._word_freqs[word] += 1
|
|
|
|
|
|
def __print_freqs(self):
|
|
|
print_word_freqs ( sort_dict (self._word_freqs) )
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
em = EventManager()
|
|
|
data_storage = TextData(em)
|
|
|
word_freq_counter = WordFrequencyCounter(em, data_storage)
|
|
|
|
|
|
em.run(testfilepath) |