论坛首页 招聘求职论坛

[中级偏下]想起一个面试题

浏览 15237 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-09-09  
这个题目比较有趣。
如果反过来,XML-->Composite object, 我一般用 Digester + 正则表达式。
从Composite--> XML,下面用Menu, MenuItem(典型Composite)为例写了点代码试了一下,通过。



//-------------------- Node.java -----------------------
public abstract class Node{
    public abstract String toXmlString();;
}


//-------------------- MenuItem.java ------------------
public class MenuItem extends Node{
    
    private String _name;
    
    public MenuItem(String name);{
        _name = name;
    }
    
    public String toXmlString();{
        return "<menuitem name='" + _name + "'/>";
    }        
}


//------------- Menu.java ------------------------
import java.util.*;
public class Menu extends Node{
    
    private String _name;
    private List _menuItems = new ArrayList();;
    
    public Menu(String name);{
        _name = name;
    }
    
    public void add(Node node);{
        _menuItems.add(node);;
    }
    
    public String toXmlString();{
        
        StringBuffer buffer = new StringBuffer("");;
        buffer.append("<menu name='");.append(_name);.append("'>");;
        for (Iterator iter = _menuItems.iterator();; iter.hasNext();; );
            buffer.append( ((Node);iter.next(););.toXmlString(); );;
        buffer.append("</menu>");;
        return buffer.toString();;            
    }
}


//----------------- TestMain.java ----------------------
public class TestMain{
    
    public static void main(String[] args);{
        
        Menu _menu = new Menu("Company");;
        Menu _menu1 = new Menu("Department #1");;
        MenuItem _gates = new MenuItem("Bill Gates");;
        
        _menu1.add(new MenuItem("Jim Johnson"););;
        _menu1.add(_gates);;
        
        
        _menu.add(_gates);;
        _menu.add(_menu1);;
        
        
        System.out.println("_menu := { "+_menu.toXmlString();+" }\n");;
        System.out.println("_menu1 := { "+_menu1.toXmlString();+" }\n");;
        System.out.println("_gates := { "+_gates.toXmlString();+" }\n");;
                
    }
}




执行结果如下:

引用
>ant exec
Buildfile: build.xml

exec:
     [java] _menu := { <menu name='Company'><menuitem name='Bill Gates'/><menu name='Department #1'><menuitem name='Jim Johnson'/><menuitem name='Bill Gates'/></menu></menu> }

     [java] _menu1 := { <menu name='Department #1'><menuitem name='Jim Johnson'/><menuitem name='Bill Gates'/></menu> }

     [java] _gates := { <menuitem name='Bill Gates'/> }
0 请登录后投票
   发表时间:2004-09-09  
突然有一个想法,通过CGLIB给Composite加上生成XML的函数,比如toXMLString();然后调用,然后再把这个函数去掉。

这样算不算AOP?但是AOP是将已有的功能划入一个方面。还是应该算“动态增减方面”?
0 请登录后投票
   发表时间:2004-09-10  
gigix 写道
刚才想起一道题,也许可以用来面试程序员。不妨来看看有没有效果。

题目很简单:有一个Composite模式的对象体系,如何把它转换成XML?请说出至少三种做法。


我的回答:做一个XMLNodeAware aspect,然后用AOP framework把aspect和已有的pojo做mixin(or introducing ?),这样这些composite对象自动变成了DOM中的node,然后直接保存好咯。。。。
0 请登录后投票
   发表时间:2004-09-10  
晕,就是因为从节点生成的xml依赖于节点本身,才采用composite这种结构。这样都可以用aop来做,我就服了aop。
0 请登录后投票
   发表时间:2004-09-11  
其实这种情况合适不合适用AOP,如果合适的话又该怎么用得最好,写段代码试试就可以了。
想一下和写出来差别很大。有时候尽管构思得挺精妙,可当一动手写的时候,你就会发现全不对头
0 请登录后投票
   发表时间:2004-09-13  
nihongye 写道
晕,就是因为从节点生成的xml依赖于节点本身,才采用composite这种结构。这样都可以用aop来做,我就服了aop。


的确,我没有写过上面的代码,但是我用AOP写过可以动态改变结构的代码,比如一个NodeAware的aspect,任何bo只要和这个NodeAware结合,就可以具备树型节点的特点。
现在是既然是用了Composite,那么就是把这个对象树保存起来就可以了,要保存起来,只要用DP改变每个node,增加一个DOM Node的接口就可以了。

随便想想,欢迎拍砖。
0 请登录后投票
   发表时间:2004-09-15  
这里面有几个地方我不太了解一个是Castor XML是干嘛的,另外一个就是Digester主要用在哪里。

基本上来讲,一个是确定以下XML的结构,使其能够表示Composite的对象。
另外一个是具体的实现策略,
比如:直接通过增加方法如 toXMLString或者什么的
另外也可以通过将具体的转化工作作为一种可变的类型,而按照visitor的模式来处理。
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics