You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理多输入多输出场景应选用哪种设计模式?以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:24:03