《Java设计模式之组合模式》

《组合模式》

  组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

public abstract class Component {
	protected String name;
	public Component(String name) {
		this.name = name;
	}
	//添加节点
	public abstract void add(Component c);
	//删除节点
	public abstract void remove(Component c);
	//显示节点
	public abstract void display();
}
public class Composite extends Component {
	
	private List<Component> leafs = new ArrayList<>();
	
	public Composite(String name) {
		super(name);
	}

	@Override
	public void add(Component c) {
		leafs.add(c);
	}

	@Override
	public void remove(Component c) {
		leafs.remove(leafs.indexOf(c));
	}

	@Override
	public void display() {
		System.out.println(this.name);
		for (Component component : leafs) {
			component.display();
		}
	}
}
public class Leaf extends Component{
	public Leaf(String name) {
		super(name);
	}
	@Override
	public void display() {
		System.out.println(this.name);
	}
	@Override
	public void add(Component c) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void remove(Component c) {
		// TODO Auto-generated method stub
		
	}
}
  Component接口中定义了add和remove对叶子节点的操作方法,但是leaf类中是没有这个功能,却也继承了该方法,这样做的好处就是是的叶子节点和枝节点对于外界没有区     别,它们具有完全一致的接口。但是问题也很明显,leaf没有添加节点的功能,所以实现add和remove没有意义。这种方式就叫透明方式。当然也可以选择在component接口     中不提供这两个方法,而是让composite自己提供,这样的话leaf和composite就没有一致的接口,客户端调用时需要判断,有点麻烦,这种方式是安全方式。

 总结

  当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。



猜你喜欢

转载自blog.csdn.net/eragon444668/article/details/76685640