处理多输入多输出场景应选用哪种设计模式?以Amazon Alexa为例
适配方案推荐:策略模式 + 桥接模式组合
这个多输入多输出的Alexa场景核心诉求是解耦异构输入/输出逻辑和通用业务逻辑,避免新增输入输出类型时反复修改核心代码,上述两个模式的组合完全匹配你的需求。
核心设计思路
你的场景存在三个独立变化的维度,设计时要把三者完全拆分:
- 输入层:不同类型输入的预处理逻辑(语音ASR转写、文本纠错等)
- 业务层:通用意图识别、逻辑处理,和输入输出类型无关
- 输出层:不同输出通道的内容格式化、发送逻辑(TTS合成、邮件拼接等)
输入层用策略模式封装
定义统一的InputHandler抽象接口,每一种输入类型对应一个实现类,各自实现输入解析逻辑,最终输出通用的内部请求对象,业务层完全不需要感知具体输入类型。
示例伪代码:
from abc import ABC, abstractmethod # 统一输入处理接口 class InputHandler(ABC): @abstractmethod def parse(self, raw_input) -> InternalRequest: pass # 语音输入处理实现 class VoiceInputHandler(InputHandler): def parse(self, raw_audio): # 内部执行ASR转写、口语顺滑、实体抽取逻辑 return InternalRequest( intent="query_weather", slots={"city": "Shanghai", "date": "2024-09-01"} ) # 文本输入处理实现 class TextInputHandler(InputHandler): def parse(self, raw_text): # 内部执行NLP实体抽取 return InternalRequest( intent="query_weather", slots={"city": "Shanghai", "date": "2024-09-01"} )
后续新增输入类型(比如触屏点击输入、IoT事件输入)只需要新增InputHandler的实现类即可,不影响原有逻辑。
输出层用桥接模式解耦
输出层存在两个独立变化的维度:输出内容类型(天气结果、待办提醒、订单通知等)、输出通道(语音、文本、邮件等),桥接模式可以让两个维度独立扩展,互不影响。
示例伪代码:
from abc import ABC, abstractmethod # 输出通道统一接口 class OutputChannel(ABC): @abstractmethod def send(self, formatted_content): pass # 语音输出通道实现 class VoiceOutputChannel(OutputChannel): def send(self, content): # 调用TTS服务合成语音后播放 print(f"[语音播放] {content}") # 文本输出通道实现 class TextOutputChannel(OutputChannel): def send(self, content): # 推送内容到Alexa设备屏幕展示 print(f"[文本展示] {content}") # 邮件输出通道实现 class EmailOutputChannel(OutputChannel): def send(self, content): # 调用邮件服务发送通知 print(f"[邮件发送] {content}") # 输出内容抽象类 class OutputContent(ABC): def __init__(self, output_channel: OutputChannel): self.channel = output_channel @abstractmethod def format_content(self) -> str: pass def deliver(self): formatted = self.format_content() self.channel.send(formatted) # 具体输出内容:天气查询结果 class WeatherOutputContent(OutputContent): def __init__(self, weather_data, output_channel: OutputChannel): super().__init__(output_channel) self.weather_data = weather_data def format_content(self): return f"{self.weather_data['city']}今日{self.weather_data['condition']},气温{self.weather_data['temp']}℃"
后续新增输出内容类型或者输出通道,都只需要新增对应实现类,不需要修改原有逻辑。
可选扩展
如果需要支持同一个请求同时输出到多个通道(比如待办提醒同时推送语音和邮件),可以叠加观察者模式实现多通道通知;如果需要做输入前置校验、权限判断等链路逻辑,可以叠加责任链模式实现可插拔的流程配置。
内容的提问来源于stack exchange,提问作者Suhaib Ahmed
相关产品推荐
相关产品推荐

