假设我想使用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应该有的东西的一个例子。
答案 0 :(得分:4)
decorator pattern通常通过扩展具有附加功能的原始类来实现。
由于String
类是最终的,因此无法扩展。
使用组合而不是继承的缺点是,通常装饰器的实现方式使得任何可以使用X的方法都可以使用DecorativeX。 (该模式实际上应该允许您使用任意数量的装饰器来装饰X并仍然将其用作X.)您将无法使用当前设计执行此操作,并最终会重新实现任何扩展您需要的字符串功能。
可能需要采用不同的设计模式。
答案 1 :(得分:3)
我有一个Translator接口并将一个(不可变的)String传递给它。不同语言的不同实现。
为什么要将所有俄语特定逻辑嵌入到装饰的字符串中?
答案 2 :(得分:1)
这种翻译不是Java ResourceBundle背后的全部内容吗?