我想为java.lang.String
类添加功能。我想过使用装饰器模式如下:
public class StringDecorator {
String str;
public StringDecorator(String str)
{
this.str = str;
}
// Wrap all methods in String class such as:
public int length()
{
return str.length();
}
// Add other methods from String class here.. And then add new functions..
public void newFunction1()
{
}
}
但是,我在这里读到SO:https://stackoverflow.com/a/3945482这是不合适的,因为String是最终的,无法扩展。用户还建议"不同的设计模式可能是顺序"。
有人可以确认在这种情况下是否确实不适合使用装饰器模式,如果是这样,可以使用其他设计模式吗?
答案 0 :(得分:4)
这有一个问题是在装饰器模式中,装饰器和被包装的对象通常实现一个通用接口:
interface Interface {...}
class A implements Interface {...}
class ADecorator implements Interface {...}
因此,方法需要Interface
时,A
和ADecorator
都可以传递。
但是在String
的情况下,几乎所有使用它的API都需要实现类型String
而不是接口类型CharSequence
。因此,当您创建此包装器时,您不能仅使用需要String
的方法。由于String
是final
,因此您无法扩展它并以此方式解决问题。
你所拥有的东西仍然有用,但它应该被视为组合,并且有一个getString
(或其他)方法来检索包装对象(如某人建议的那样)会很有帮助,所以你仍然可以使用需要String
的方法。
假设您也将使您的类不可变,那么拥有这些委托方法仍然有用,而是返回包装类的实例:
public StringDecorator replace(char oldChar, char newChar) {
return new StringDecorator(str.replace(oldChar, newChar));
}
但在大多数情况下,你可以使用类似decorator.getString().length()
的东西。