码迷,mamicode.com
首页 > 其他好文 > 详细

组合模式

时间:2016-08-06 11:32:45      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

定义:将对象组合成树型结构以表示 部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性


类图:

技术分享


代码:

public abstract class Component {

	public abstract void doSomething();
}

public class Composite extends Component{
	
	private ArrayList<Component> list = new ArrayList<Component>();

	public void add(Component component){
		list.add(component);
	}
	
	public void remove(Component component){
		list.remove(component);
	}
	
	public ArrayList<Component> getChildren(){
		return list;
	}

}

public class Leaf extends Component{

	@Override
	public void doSomething(){
		
	}
}




优点:

1.高层模块调用简单:

一棵树机构中所有节点都是Component,局部和整体对调这来说没有任何区别。

2.节点自由增加:


缺点:

在使用时,不能面向接口编程吗,违反了依赖倒置原则


扩展

透明组合模式

类图同上,仅仅是将所有方发全部在Component中定义。子类在不需要该方法时可以抛出异常

修改后的基类:

public abstract class Component {

	public  void doSomething(){}
	public abstract void add(Component component);
	
	public abstract void remove(Component component);
	
	public abstract ArrayList<Component> getChildren();
}

public class Leaf extends Component{

	@Override
	public void doSomething(){
		
	}

	@Override
	public void add(Component component) throws UnsupportedOperationException{
		// TODO Auto-generated method stub
		throw new UnsupportedOperationException();
	}

	@Override
	public void remove(Component component) throws UnsupportedOperationException{
		// TODO Auto-generated method stub
		throw new UnsupportedOperationException();
	}

	@Override
	public ArrayList<Component> getChildren() throws UnsupportedOperationException{
		// TODO Auto-generated method stub
		throw new UnsupportedOperationException();
	}
	
	
}
透明模式的好处是遵循了依赖倒置原则


如果我们想更好的实现可以设置一个节点的父节点

代码:

public abstract class Component {
	
	private Component parent = null;
	
	protected void setParent(Component parent){
		this.parent = parent;
	}
	
	protected Component getParent(){
		return parent;
	}
	
	public  void doSomething(){}
	
	public abstract void add(Component component);
	
	public abstract void remove(Component component);
	
	public abstract ArrayList<Component> getChildren();
}

public class Composite extends Component{
	
	private ArrayList<Component> list = new ArrayList<Component>();

	public void add(Component component){
		component.setParent(this);
		list.add(component);
	}
	
	public void remove(Component component){
		list.remove(component);
	}
	
	public ArrayList<Component> getChildren(){
		return list;
	}

}
这样每个对象都有其parent




组合模式

标签:

原文地址:http://blog.csdn.net/renpengddxx/article/details/52134559

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!