Java 设计模式为;toString";第三方对象

Java 设计模式为;toString";第三方对象,java,design-patterns,Java,Design Patterns,我有一个第三方对象,它使用从Java.lang.object继承的toString方法。这种方法毫无用处。然而,我想不出一个干净的设计来覆盖这种行为。下面是不同的方法 子类并重写toString方法 问题:如果原始对象的内部调用调用toString并检查返回的字符串,它们现在将中断。我不想破坏现有的对象,也不想假设任何关于第三方代码清洁度的事情 使用createString方法创建StringFactory。此方法在所有对象上调用toString,但我的第三方对象除外,但对于我的对象,将以自定义

我有一个第三方对象,它使用从Java.lang.object继承的toString方法。这种方法毫无用处。然而,我想不出一个干净的设计来覆盖这种行为。下面是不同的方法

  • 子类并重写toString方法
  • 问题:如果原始对象的内部调用调用toString并检查返回的字符串,它们现在将中断。我不想破坏现有的对象,也不想假设任何关于第三方代码清洁度的事情

  • 使用createString方法创建StringFactory。此方法在所有对象上调用toString,但我的第三方对象除外,但对于我的对象,将以自定义方式构建字符串
  • 问题:我既不能要求将所有内容都传递给createString方法,也不能直接调用toString(这在大型代码库中是很可笑的),也不能轻松记住应该传递哪些对象,因为它们有自定义逻辑


    有没有人有一个干净的设计模式?

    只需在util类上使用静态方法:

    public class MyUtils {
    
        public static String toString(My3rdPartyClass obj) {
            // impl here
        }
    }
    

    我真的很喜欢波希米亚人的回答

    考虑到这一点,解决这个问题的OOP方法是

    class My3rdPartyClassFormatter {
        private My3rdPartyClass data;
        public My3rdPartyClassFormatter(My3rdPartyClass d) { this.data = d; }
        public String toString() { 
            // impl here
        }
    }
    
    使用一个。调用处理程序将拦截对第三方对象的所有调用。在大多数情况下,它只会通过它们。但是,实现您自己的toString逻辑

    InvocationHandler handler = new InvocationHandler
    {
           private ThirdParty thrd ;
    
           public Object invoke ( Object proxy , Method method , Object [ ] args ) throws Throwable
           {
                 if ( method . getName().equals ( "toString" ) )
                 {
                      return "useful string" ;
                 }
                 else
                 {
                      return method . invoke ( thrd , args ) ;
                 }
           }
    }
    

    子类化并提供一个
    myToString
    方法,并在您自己的代码中使用它,这可能是一个解决方案,具体取决于您想要实现什么。它会起作用吗?关于#1-如果他们调用
    toString
    ,并且根据其正确性的答案,他们无法理解
    toString
    @glowcoder的目的是的,这就是为什么我建议使用一种新方法,而不是重写。与波希米亚人的答案相似,但更符合我的口味。我真的很喜欢这个。优雅、简短、可重用且无改动。@glowcoder这种方法的另一个优点是避免了类膨胀:您可以为任意多个其他类添加impl。我觉得这与原始问题中的#2相同。除了将这个类的范围扩大到包括所有的实用程序之外,我觉得这是一个错误,因为可能有大量的实用程序。我接受这个答案,因为这可能是回答我书面问题的最好方式,而且,因为希望在不改变子类行为的情况下覆盖自己个人使用的方法的用例可能不会扩展到“toString”之后。这不是装饰器模式的一种变体吗?仔细想想——这是一个包装器类。我赞成这个建议。现在在这个问题上投了3票之后,我今天的票数都用完了。@Hovercraft是的,它更像是一个包装纸。我不认为它是一个装饰器,但我可以看到它与装饰器相比的实用性。代理是非常强大的,但是如果你不小心会引起问题(例如,你也可能需要处理<代码>平等的< /代码>方法)。此外,代理需要一个目标接口。尽管如此,+1,因为在某些情况下这是一个解决方案。