用于生成 HTML 标签的设计模式

Mik*_* S. 6 html java design-patterns

对于可以获取 String 并输出 HTML 的小型系统,哪种设计模式适合?

这是一个小例子:

public String makeStrong(String in) {

    return "<strong>" + in + "</strong>";
}
Run Code Online (Sandbox Code Playgroud)

当然,它需要对一些层次结构进行建模,以便它可以适合<ul><ol>和他们的孩子。我在考虑装饰器,复合模式听起来也不错。我应该考虑什么?

nic*_*bot 3

考虑用于构建经过验证的 HTML 片段的构建器模式。我编写了一些类似于验证 HTML 以在 Swing 应用程序组件(例如工具提示)中使用的内容。这是您可以构建的大致框架:

public final class HtmlBuilder()
{
  private final StringBuilder sb = new StringBuilder();
  private final Deque tagStack = new ArrayDeque();  

  public HtmlBuilder()
  {
    startTag("html");
  }

  // Consider using an enum of valid tags and extending to support attributes
  public HtmlBuilder startTag( String tag )
  {
    // TODO preconditions
    tagStack.push( tag );
    sb.append('<').append(tag).append('>');
    return this;
  }

  public HtmlBuilder endTag( String tag )
  {
    // TODO preconditions,
    // e.g. check "!tagStack.isEmpty() && tagStack.peek().equals( tag )
    tagStack.pop();
    sb.append('<').append('/').append(tag).append('>');
    return this;
  }

  public HtmlBuilder append( String text )
  {
    // TODO Preconditions, check for/escape special characters etc
    sb.append( text );
    return this;
  }

  @Override
  public String toString()
  {
    endTag("html")
    return sb.toString();
  }
}
Run Code Online (Sandbox Code Playgroud)

简单用例:

String html = new HtmlBuilder()
    .startTag( "strong" ).append( "text" ).endTag( "strong" )
    .toString();
Run Code Online (Sandbox Code Playgroud)

您可以根据需要添加任意数量的验证,例如将“tr”定义为仅允许在“表”内使用。我怀疑已经有类似的事情了。