Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将装饰器模式应用于Java字符串类_Java_String_Design Patterns_Decorator - Fatal编程技术网

将装饰器模式应用于Java字符串类

将装饰器模式应用于Java字符串类,java,string,design-patterns,decorator,Java,String,Design Patterns,Decorator,我想向java.lang.String类添加功能。我考虑使用decorator模式,如下所示: public class StringDecorator { String str; public StringDecorator(String str) { this.str = str; } // Wrap all methods in String class such as: public int l

我想向java.lang.String类添加功能。我考虑使用decorator模式,如下所示:

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()
    {

    }
}
然而,我在这里读到:这是不合适的,因为字符串是最终的,不能扩展。用户还建议采用不同的设计模式


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

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

interface Interface {...}
class A implements Interface {...}
class ADecorator implements Interface {...}
因此,在方法需要接口的地方,可以传递a和ADecorator

但是对于String,几乎所有使用它的API都需要实现类型String,而不是接口类型CharSequence。因此,当您创建此包装器时,您不能仅将其与需要字符串的方法一起使用。因为字符串是最终的,所以不能扩展它,这样就可以解决问题

您所拥有的仍然是有用的,但应该将其视为组合,并且有一个getString或任何方法来检索包装对象(如有人建议的那样)会很有帮助,这样您仍然可以将其用于需要字符串的方法

假设您还将使您的类不可变,使用这些委托方法仍然很有用,但会返回包装器类的实例:

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

但在大多数情况下,您可以使用decorator.getString.length之类的工具来解决问题。

其中的一个问题是,在decorator模式中,decorator和被包装的对象通常实现一个公共接口:

interface Interface {...}
class A implements Interface {...}
class ADecorator implements Interface {...}
因此,在方法需要接口的地方,可以传递a和ADecorator

但是对于String,几乎所有使用它的API都需要实现类型String,而不是接口类型CharSequence。因此,当您创建此包装器时,您不能仅将其与需要字符串的方法一起使用。因为字符串是最终的,所以不能扩展它,这样就可以解决问题

您所拥有的仍然是有用的,但应该将其视为组合,并且有一个getString或任何方法来检索包装对象(如有人建议的那样)会很有帮助,这样您仍然可以将其用于需要字符串的方法

假设您还将使您的类不可变,使用这些委托方法仍然很有用,但会返回包装器类的实例:

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

但在大多数情况下,您可以使用decorator.getString.length之类的东西来逃脱惩罚。

您没有扩展字符串,所以这很好。虽然简单地使用getString方法和newFunction1方法而不是重复所有string方法可能会更好String@assylias谢谢那么,用户Tom Tresansky关于装饰器模式通常通过使用添加的功能扩展原始类来工作的断言是不正确的?我可以实现decorator模式而不扩展任何东西?这和包装器模式有什么区别?您没有扩展字符串,所以这很好。虽然简单地使用getString方法和newFunction1方法而不是重复所有string方法可能会更好String@assylias谢谢那么,用户Tom Tresansky关于装饰器模式通常通过使用添加的功能扩展原始类来工作的断言是不正确的?我可以实现decorator模式而不扩展任何东西?这和包装器模式有什么区别?