淘宝笔试题之composite模式

        去浙大的淘宝招聘会参加了笔试,果然被“笔试”了,轻易被刷还是心有不甘,贴上编程题的想法。

        题目是要求将一颗树进行反转,我用的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~

你可能感兴趣的:(淘宝笔试题之composite模式)