design pattern——组合模式

本文介绍了一种设计模式——组合模式,并通过实例演示了如何利用该模式处理树状结构数据。组合模式能够将简单元素和复杂元素统一处理,简化客户端代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

 

 

组合模式结构图:

 



 

 

 

 

 

组合模式实现代码:

 

/**
 * 为树叶或树枝抽象一个接口
 * @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
		 */
	}

}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值