我的代码是否属于任何设计模式?

时间:2012-04-26 14:03:24

标签: java design-patterns

我有这段代码:

private String objectToString(Object obj){
if (obj instanceof String)
    return (String)obj;
if (obj instanceof Struct){
    Map<String,?> map = ((Struct)obj).getMembers();
     return map.toString();
 }
Class c = obj.getClass();
if (c.isArray())
{
    //obj. iterate elements and return values;
    return obj.toString();//to redi this

}
//this is for any other datatypes
else
    return obj.toString();

}

有人可以建议这是否属于GOF.Code的任何设计模式是直截了当的,只是为了澄清它查看传递的参数,并取决于以人类可读形式返回字符串的类型。

2 个答案:

答案 0 :(得分:6)

您的代码是反模式的明显示例。最干净的方法是简单地覆盖您想要自定义文本表示的每个对象的toString()方法。例如,每次调用System.out.println(someObject)时 - 它会调用此特定对象的toString()。

这是一个article,解释如何/为什么覆盖这是一个好主意。试想一下 - 为什么你必须将关于不同对象的文本表示的逻辑集中在一起,这些对象可能没有任何共同之处?这就是为什么toString()是Java的Object对象的一部分的原因,并且因为java中的每个类都隐式地从Object继承,所以覆盖toString()方法是完全合理的。

覆盖toString()方法还可以访问对象的内部状态,如果要进行正确的文本表示,可能需要这样做,这对于您提出的实现是不容易的(尽管它当然是可能的)拥有公共领域或吸气剂等。仅仅为了文本表示而这样做是没有意义的。)

答案 1 :(得分:0)

您正在尝试使用Adapter模式,您应该使用多态。

Struct上实施适当的toString(),你就在家。即。

public class Struct {
    ...
    public String toString() {
        return getMembers().toString();
    }
}

其余代码是冗余的(如果obj是字符串,(String) objobj.toString()会产生相同的结果。)