代码之家  ›  专栏  ›  技术社区  ›  Vincent Ramdhanie

将转换应用于多个类中的多个属性的设计模式

  •  3
  • Vincent Ramdhanie  · 技术社区  · 17 年前

    我在一个项目中使用WMD标记编辑器处理大量字段,这些字段对应于大量实体类中的大量属性。某些类可能有多个属性需要降价。

    我存储的降价本身,因为这使它更容易编辑字段以后。但是,我需要将属性转换为HTML,以便稍后显示。问题是:是否有一些模式可以用来避免在所有实体类中编写标记转换代码?

    问题是,对于存储标记的每个类的每个属性,我可能需要另一个转换为HTML的方法:

    public class Course{
    
         private String description;
         .
         .
         .
         public String getDescription(){
              return description;
         }
    
         public String getDescriptionAsHTML(){
              return MarkdownUtil.convert(getDescription());
         }
         .
         .
         .
     }
    

    问题是,如果课程类还有两个属性,比如说学费和先决条件,它们都需要转换器,那么我必须编写getuitionashtml()和getPrerequisiteAsHTML()。

    我觉得这有点难看,想要一个更干净的解决方案。需要此功能的类不是单个继承层次结构的一部分。

    我正在考虑的另一个选择是在控制器中而不是在模型中执行此操作。你对此有何看法?

    谢谢

    [编辑]:新想法(谢谢Jasper)。由于该项目使用struts2(我以前没有说过),我可以创建一个视图组件,可以为我转换标记。然后我在需要将值显示为HTML的任何地方使用它。

    3 回复  |  直到 17 年前
        1
  •  2
  •   Jasper Bekkers    17 年前

    需要此功能的类不是单个继承层次结构的一部分。

    他们至少应该实现一个公共接口,否则提出一个干净的通用解决方案会很麻烦。

    我正在考虑的另一个选择是在控制器中而不是在模型中执行此操作。你对此有何看法?

    然而,我觉得关于您当前的体系结构几乎没有什么细节可以为您的问题提供有意义的答案。

        2
  •  1
  •   Justin Bozonier    17 年前

    如果您不能使用继承或接口,那么您有一个选项来执行此操作。我知道,我知道重构,但这是现实,而且会发生。

    您可以使用反射来迭代属性并对其应用格式。您可以使用属性标记它们,也可以采用命名方案(易碎,但仍然是一个选项)。

        3
  •  1
  •   Chris Cudmore    17 年前

    忽略架构问题,我认为简单的答案可能是:

    public String getDescription(MarkDownUtil converter)
    {
        if (converter == null) return description;
        else return MarkdownUtil.convert(description);
    }
    

    更好的办法是让MarkDownUtil实现IStringConverter,您可以 针对不同的工作,有几种不同的转换器。