gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:36:32 25 4
gpt4 key购买 nike

我想向 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 是最终的并且不能被扩展。用户还建议“可能需要一种不同的设计模式”。

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

最佳答案

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

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

因此,在方法需要 Interface 的地方,可以传递 AADecorator

但是对于String,几乎所有使用它的API 都需要实现类型String 而不是接口(interface)类型CharSequence。因此,当您创建此包装器时,您不能仅将其与需要 String 的方法一起使用。由于 Stringfinal,您不能扩展它并以这种方式解决问题。


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

假设您还将使您的类不可变,拥有这些委托(delegate)方法可能仍然有用,但返回包装类的实例:

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

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

关于java - 将装饰器模式应用于 Java String 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43682185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com