design pattern——组合模式

针对问题:组合模式使我们在处理树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

组合模式结构图:



组合模式实现代码:

/**
 * 为树叶或树枝抽象一个接口
 * @author bruce
 *
 */
public abstract class Component {
	
	public abstract void operation();
	
	public void add(Component component){
		throw new UnsupportedOperationException();
	}
	
	public void remove(Component component){
		throw new UnsupportedOperationException();
	}
	
	public Component getChild(int index){
		throw new UnsupportedOperationException();
	}

}





/**
 * 树叶
 * @author bruce
 *
 */
public class Leaf extends Component{
	
	private String name;
	
	public Leaf(String name){
		this.name=name;
	}
	
	@Override
	public void operation() {
		// TODO Auto-generated method stub
		System.out.println(name);
	}

}




/**
 * 树枝
 * @author bruce
 *
 */
public class Composite extends Component{
	
	private List<Component> list=new ArrayList<Component>();
	
	private String name;
	
	public Composite(String name){
		this.name=name;
	}
	
	@Override
	public void operation() {
		// TODO Auto-generated method stub
		System.out.println(name);
		/**
		 *  for..each 递归调用operation()
		 */
		Iterator<Component> iterator=list.iterator();
		while(iterator.hasNext()){
			Component component=iterator.next();
			component.operation();
		}
	}
	
	@Override
	public void add(Component component) {
		// TODO Auto-generated method stub
		list.add(component);
	}
	
	@Override
	public void remove(Component component) {
		// TODO Auto-generated method stub
		list.remove(component);
	}
	
	@Override
	public Component getChild(int index) {
		// TODO Auto-generated method stub
		return list.get(index);
	}

}






/**
 * 测试
 * @author bruce
 *
 */
public class Client {
	
	public static void main(String[] args) {
		Component c=new Composite("C:/");
		Component cl=new Leaf("test.java");
		
		Component cc=new Composite("C:/program file/");
		Component cclA=new Leaf("QQ.exe");
		Component cclB=new Leaf("360.exe");
		
		cc.add(cclA);
		cc.add(cclB);
		
		c.add(cl);
		c.add(cc);
		
		c.operation();
		
		/**
		 * output:
		 * 
		    C:/
			test.java
			C:/program file/
			QQ.exe
			360.exe
		 */
	}

}


 

猜你喜欢

转载自xieyaxiong.iteye.com/blog/1605173