用Java装饰字符串

时间:2010-10-15 18:57:24

标签: java decorator

假设我想使用Decorator模式向java.lang.String类添加功能。 (例如,添加toRussian()方法。)String是最终类。以下是唯一的方法吗?

class DecoratedString implements Serializable, CharSequence, 
    Comparable<DecoratedString> 
{
  private final String str;
  public DecoratedString (String str) {
    this.str = str;
  }
  public DecoratedString toRussian() {
     ...
  }
  public String toString() { return str; }
  public int hashCode() { return str.hashCode(); }
  public boolean equals(Object obj) { /* don't forget this one */ } 
  public char charAt(int index) { return str.charAt(index);}
  public int codePointAt(int index) { return str.codePointAt(index);}
  ... and so on for 30 or so more methods of String ...
}

用法:

String greeting = new DecoratedString("Hello, world!").toRussian().toString();

后记:在Objective-C中使用“类别”这很容易。 Python现在有@Decorators。当然,它在JavaScript中很简单,你经常将trim()添加到String原型中。在Java中完全不可能吗?

Postpostscript:好的,toRussian()是个坏榜样。如果String还没有trim(),你会如何添加trim()? trim()是每个String应该有的东西的一个例子。

3 个答案:

答案 0 :(得分:4)

decorator pattern通常通过扩展具有附加功能的原始类来实现。

由于String类是最终的,因此无法扩展。

使用组合而不是继承的缺点是,通常装饰器的实现方式使得任何可以使用X的方法都可以使用DecorativeX。 (该模式实际上应该允许您使用任意数量的装饰器来装饰X并仍然将其用作X.)您将无法使用当前设计执行此操作,并最终会重新实现任何扩展您需要的字符串功能。

可能需要采用不同的设计模式。

答案 1 :(得分:3)

我有一个Translator接口并将一个(不可变的)String传递给它。不同语言的不同实现。

为什么要将所有俄语特定逻辑嵌入到装饰的字符串中?

答案 2 :(得分:1)

这种翻译不是Java ResourceBundle背后的全部内容吗?