【问题标题】:Applying the Decorator Pattern to Java String Class将装饰器模式应用于 Java 字符串类
【发布时间】:2017-04-28 14:06:04
【问题描述】:

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

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

【问题讨论】:

  • 你没有扩展字符串,所以没关系。尽管简单地使用getString() 方法和newFunction1 方法而不是重复所有字符串方法可能看起来会更好。
  • 你正在做的是为字符串添加一个包装器
  • @assylias 谢谢。所以 SO 用户 Tom Tresansky 断言“装饰器模式通常通过扩展具有附加功能的原始类来工作”是不正确的?我可以在不扩展任何东西的情况下实现装饰器模式吗?这和包装模式有什么区别?

标签: java string design-patterns decorator


【解决方案1】:

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

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() 之类的东西。

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 2015-02-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2013-04-28
    • 2020-11-30
    • 2011-04-26
    • 2011-04-22
    相关资源
    最近更新 更多