寻求适用于带模式切换的流过滤器的优化设计模式
带模式切换的流过滤器:设计模式与优雅实现咨询
核心场景
我常需处理字符流转换需求,核心逻辑是根据动态切换的模式调整转换规则,具体场景包括:
1. 方向映射
输入坐标元组,输出对应方向字符串:
| INPUT STREAM | (-1, 0) | (0, 1) | (0, 1) | (0, 1) | (0, -1) | (0, 1) | (0, 1) |
|---|---|---|---|---|---|---|---|
| OUTPUT STREAM | "left" | "up" | "right" | "up" | "down" | "right" | "right" |
2. 大小写切换
通过$字符触发大小写模式切换,输入输出对应关系:
| INPUT: | "ApPleS" | "$" | "BaNaNaS" | "$" | "BLACKberries" | "$" | "BlUeBeRrIeS" | "$" | "CaNtAlOuPe" |
|---|---|---|---|---|---|---|---|---|---|
| OUTPUT: | "APPLES" | 切换模式 | "bananas" | "BLACKBERRIES" | 切换模式 | "blueberries" | 切换模式 | 切换模式 | "CANTALOUPE" |
3. 驼峰转下划线
将驼峰命名转换为下划线分隔的小写命名:
- 输入:
getUserInput()→ 输出:get_user_input() - 输入:
RedDeliciousApples→ 输出:red_delicious_apples
4. 去除连续重复
规则:单个字符最多保留2次连续重复,多字词串仅保留一次:
| INPUT | OUTPUT |
|---|---|
| "Misssssssssissssssssippppppppppi" | "Mississippi" |
| "apple apple apple apple" | "apple" |
| "\n\n\n\n\n\n\n\n" | "\n\n" |
当前实现痛点
我目前采用嵌套循环、大量if-else分支和布尔标志(如is_lowercase)实现,代码可读性差、冗余严重。例如大小写切换的初始实现:
import io def eat_the_string(chars:str): strm = io.StringIO() is_lowercase = False for ch in chars: if ch == "$": is_lowercase = not is_lowercase else: if is_lowercase: print(ch.lower(), file=strm, sep="", end="") else: print(ch.upper(), file=strm, sep="", end="") return strm.getvalue()
我尝试用抽象基类重构了部分逻辑,将不同模式封装为独立类,但希望找到更通用的解决方案:
# 抽象基类重构示例 import io from abc import ABC, abstractmethod class PacAbstract(ABC): @abstractmethod def process_a_char(self, ch: str): pass class PacModeLowercase(PacAbstract): def process_a_char(self, ch: str): return ch.lower() class PacModeUppercase(PacAbstract): def process_a_char(self, ch: str): return ch.upper() class PacMan(PacAbstract): def __init__(self, *, mode: str = "lower"): mode = mode.strip().lower() self._pac_mode = PacModeLowercase() if mode == "lower" else PacModeUppercase() def process_a_char(self, ch: str): return self._pac_mode.process_a_char(ch)
咨询问题
- 针对这类带动态模式切换的流过滤器,最适合的设计模式是什么?
- 如果暂时不确定模式名称,能否提供替代布尔标志的优雅实现伪代码?
内容的提问来源于stack exchange,提问作者Toothpick Anemone
相关产品推荐
相关产品推荐

