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>和他们的孩子。我在考虑装饰器,但复合模式听起来也不错。我应该考虑什么?
考虑用于构建经过验证的 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”定义为仅允许在“表”内使用。我怀疑已经有类似的事情了。