将装饰器模式应用于Java String类

时间:2017-04-28 14:06:04

标签: java string design-patterns decorator

我想为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是最终的,无法扩展。用户还建议"不同的设计模式可能是顺序"。

有人可以确认在这种情况下是否确实不适合使用装饰器模式,如果是这样,可以使用其他设计模式吗?

1 个答案:

答案 0 :(得分:4)

这有一个问题是在装饰器模式中,装饰器和被包装的对象通常实现一个通用接口:

interface Interface {...}
class A implements Interface {...}
class ADecorator implements Interface {...}

因此,方法需要Interface时,AADecorator都可以传递。

但是在String的情况下,几乎所有使用它的API都需要实现类型String而不是接口类型CharSequence。因此,当您创建此包装器时,您不能仅使用需要String的方法。由于Stringfinal,因此您无法扩展它并以此方式解决问题。

你所拥有的东西仍然有用,但它应该被视为组合,并且有一个getString(或其他)方法来检索包装对象(如某人建议的那样)会很有帮助,所以你仍然可以使用需要String的方法。

假设您也将使您的类不可变,那么拥有这些委托方法仍然有用,而是返回包装类的实例:

public StringDecorator replace(char oldChar, char newChar) {
    return new StringDecorator(str.replace(oldChar, newChar));
}

但在大多数情况下,你可以使用类似decorator.getString().length()的东西。