Java读取文件时如何基于装饰器模式动态创建嵌套对象?
动态构建装饰器模式的嵌套对象
这个问题挺典型的——要根据可变长度的水果列表,动态生成apple(banana(strawberry()))这种嵌套的装饰器对象,硬编码索引肯定行不通,得用循环从内到外逐步组装。我来给你捋捋思路,再拿Python举个实际的例子:
核心思路
装饰器模式的嵌套是外层对象包裹内层对象,所以我们可以从最底层的对象(列表最后一个元素)开始,然后依次用前面的类去包裹它,直到遍历完所有水果类。具体步骤:
- 拆分输入行,提取出水果类名的列表(去掉开头的
Add) - 从列表最后一个元素创建基础对象
- 从倒数第二个元素往前遍历,逐个用当前类包裹已有的嵌套对象
- 最终得到完整的嵌套结构
代码实现
先定义符合装饰器模式的水果类(每个类接收一个component参数,代表被装饰的对象):
# 装饰器模式的水果类示例 class strawberry: def __init__(self, component=None): self.component = component def operation(self): # 用于展示嵌套结构的方法 result = "strawberry" if self.component: result = f"{result}({self.component.operation()})" return result class banana: def __init__(self, component=None): self.component = component def operation(self): result = "banana" if self.component: result = f"{result}({self.component.operation()})" return result class apple: def __init__(self, component=None): self.component = component def operation(self): result = "apple" if self.component: result = f"{result}({self.component.operation()})" return result
然后动态构建嵌套对象:
# 模拟读取文本行并拆分 input_line = "Add apple banana strawberry" splited = input_line.split() # 提取水果类名(去掉第一个"Add") fruit_classes = splited[1:] # 处理空列表的边界情况 if not fruit_classes: nested_object = None else: # 从最后一个水果开始创建基础对象 # 用globals()根据类名字符串获取类对象 nested_object = globals()[fruit_classes[-1]]() # 从倒数第二个水果往前遍历,逐个包裹 for fruit_name in reversed(fruit_classes[:-1]): # 用当前类包裹已有的嵌套对象 nested_object = globals()[fruit_name](nested_object) # 测试输出嵌套结构 print(nested_object.operation()) # 输出: apple(banana(strawberry))
关键细节解释
- 动态获取类:用
globals()[fruit_name]可以根据字符串形式的类名获取对应的类对象,这样不用硬编码每个类的判断 - 遍历顺序:
reversed(fruit_classes[:-1])把除了最后一个元素的列表反转,确保我们从内到外依次包裹(比如先包裹strawberry成banana(strawberry),再包裹成apple(banana(strawberry))) - 边界处理:如果输入行只有
Add没有水果,会直接返回None,避免报错
如果是其他语言(比如JavaScript),思路完全一致——只是获取类的方式换成window[fruitName](浏览器环境)或者global[fruitName](Node.js),然后同样从后往前循环组装即可。
内容的提问来源于stack exchange,提问作者ayseeee
相关产品推荐
相关产品推荐

