去浙大的淘宝招聘会参加了笔试,果然被“笔试”了,轻易被刷还是心有不甘,贴上编程题的想法。
题目是要求将一颗树进行反转,我用的java实现。
这边说明一下,在网上看到的composite模式都是通过声明接口来实现的,不过我觉得最先的方式并不是这样的,这样不容易理解。可以先通过一个类来实现,然后通过重构,将原有代码进行修改。从重构到模式~
public class Node {
List<Node> nodes = new ArrayList<Node>();
String name;
public Node(String name){
this.name = name;
}
public void add(Node n){
nodes.add(n);
}
public void remove(Node n){
nodes.remove(n);
}
public void display(){
/**
* badsmell:可以根据是否为空的属性将Node分为Leafe和ConcreteComponent
* 使用多态重构这段代码,消除if else 之后就是GOF的composite模式了
*/
if(nodes.isEmpty()){
System.out.print(name + " ");
}
else{
System.out.print(name + " ");
for(Node n : nodes){
n.display();
}
}
}
public void reverse(){
Collections.reverse(nodes);
}
}
接下来贴上测试
public class Main {
public static void main(String args[]){
Node root = new Node("1");
Node n10 = new Node("2");
Node n11 = new Node("3");
Node n21 = new Node("4");
Node n22 = new Node("5");
n10.add(n21);
n10.add(n22);
root.add(n10);
root.add(n11);
root.display();
System.out.println();
System.out.println("after reverse...");
root.reverse();
root.display();
}
}
public abstract class Component {
public Component(String name){
this.name = name;
}
String name;
public abstract void add(Component component);
public abstract void remove(Component component);
public abstract void display();
}
public class ConcreteComponent extends Component{
public ConcreteComponent(String name) {
super(name);
}
List<Component> childs = new ArrayList<Component>();
@Override
public void add(Component component) {
childs.add(component);
}
@Override
public void remove(Component component) {
childs.remove(component);
}
@Override
public void display() {
System.out.print(name + " ");
for(Component c : childs){
c.display();
}
}
}
public class Leafe extends Component{
public Leafe(String name) {
super(name);
}
@Override
public void add(Component component) {
}
@Override
public void remove(Component component) {
}
@Override
public void display() {
System.out.print(name + " ");
}
}
over~