设计模式为“toString”第三方对象

时间:2011-09-14 23:17:34

标签: java design-patterns

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

  1. 子类并覆盖toString方法。
  2. 问题:如果原始对象内部的任何调用调用toString并检查返回的String,它们现在将中断。我不想打破现有的对象,也不想假设第三方代码的清洁度。

    1. 使用createString方法创建一个StringFactory。这个方法在我所讨论的第三方对象以外的所有对象上调用toString,但是对于我的对象以我的自定义方式构建一个String。
    2. 问题:我既不能要求所有内容都传递给createString方法,也不能直接调用toString(这在大型代码库中会很荒谬),也不能轻易记住哪些对象应该被传递,因为它们有自定义逻辑。

      有没有人有一种感觉干净的设计模式?

3 个答案:

答案 0 :(得分:5)

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

public class MyUtils {

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

答案 1 :(得分:5)

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

考虑到这一点,解决它的OOP方法将是

class My3rdPartyClassFormatter {
    private My3rdPartyClass data;
    public My3rdPartyClassFormatter(My3rdPartyClass d) { this.data = d; }
    public String toString() { 
        // impl here
    }
}

答案 2 :(得分:2)

使用proxy。您的调用处理程序将拦截对第三方对象的所有调用。在大多数情况下,它只会通过它们。但是,请实现自己的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 ) ;
             }
       }
}