锁定老帖子 主题:[中级偏下]想起一个面试题
精华帖 (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'/> } |
|
返回顶楼 | |
发表时间:2004-09-09
突然有一个想法,通过CGLIB给Composite加上生成XML的函数,比如toXMLString();然后调用,然后再把这个函数去掉。
这样算不算AOP?但是AOP是将已有的功能划入一个方面。还是应该算“动态增减方面”? |
|
返回顶楼 | |
发表时间:2004-09-10
gigix 写道 刚才想起一道题,也许可以用来面试程序员。不妨来看看有没有效果。
题目很简单:有一个Composite模式的对象体系,如何把它转换成XML?请说出至少三种做法。 我的回答:做一个XMLNodeAware aspect,然后用AOP framework把aspect和已有的pojo做mixin(or introducing ?),这样这些composite对象自动变成了DOM中的node,然后直接保存好咯。。。。 |
|
返回顶楼 | |
发表时间:2004-09-10
晕,就是因为从节点生成的xml依赖于节点本身,才采用composite这种结构。这样都可以用aop来做,我就服了aop。
|
|
返回顶楼 | |
发表时间:2004-09-11
其实这种情况合适不合适用AOP,如果合适的话又该怎么用得最好,写段代码试试就可以了。
想一下和写出来差别很大。有时候尽管构思得挺精妙,可当一动手写的时候,你就会发现全不对头 |
|
返回顶楼 | |
发表时间:2004-09-13
nihongye 写道 晕,就是因为从节点生成的xml依赖于节点本身,才采用composite这种结构。这样都可以用aop来做,我就服了aop。
的确,我没有写过上面的代码,但是我用AOP写过可以动态改变结构的代码,比如一个NodeAware的aspect,任何bo只要和这个NodeAware结合,就可以具备树型节点的特点。 现在是既然是用了Composite,那么就是把这个对象树保存起来就可以了,要保存起来,只要用DP改变每个node,增加一个DOM Node的接口就可以了。 随便想想,欢迎拍砖。 |
|
返回顶楼 | |
发表时间:2004-09-15
这里面有几个地方我不太了解一个是Castor XML是干嘛的,另外一个就是Digester主要用在哪里。
基本上来讲,一个是确定以下XML的结构,使其能够表示Composite的对象。 另外一个是具体的实现策略, 比如:直接通过增加方法如 toXMLString或者什么的 另外也可以通过将具体的转化工作作为一种可变的类型,而按照visitor的模式来处理。 |
|
返回顶楼 | |