Предположим, я хочу использовать шаблон Decorator для добавления функциональности в класс java.lang.String. (Например, чтобы добавить метод toRussian ().) Строка - это последний класс. Является ли следующий способ сделать это единственно возможным?
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 () - плохой пример. Как бы вы добавили trim (), если бы в String еще не было trim ()? trim () является примером того, что должна иметь каждая строка.